2012-02-07 13 views
6

Próbuję dołączyć znak% do wyjścia prop.table do użycia w Sweave. Moja próba kod jest poniżej:Dołączanie znaku% do wyjścia pliku prop.table

m <- matrix(1:4,2) 
dimnames(m) <- list(c("A", "B"), c("C", "D")) 
prop.table(m,1)*100 

     C  D 
A 25.00000 75.00000 
B 33.33333 66.66667 


paste(round(prop.table(m,1)*100, 3), "%", sep = "") 
[1] "25%"  "33.333%" "75%"  "66.667%" 


paste(sprintf("%.1f", prop.table(m,1)*100), "%", sep = "") 
[1] "25.0%" "33.3%" "75.0%" "66.7%" 

Korzystanie paste zmieni klasę od matrycy do charakteru. Byłbym bardzo wdzięczny, gdyby ktoś wskazał mi właściwe rozwiązanie. Dzięki

Odpowiedz

5

Większość funkcje zaprojektowane do pracy z wektorami również przyjąć macierze ale zwróci wektor zamiast matrycy: paste, sprintf itp Można użyć apply, że wróci do macierzy.

apply( 
    prop.table(m,1)*100, 
    2, 
    function(u) sprintf("%.1f%%", u) 
) 
+0

(+1): Dzięki @Vincent. Tego właśnie szukałem. Czy masz jakąś funkcję, która pozwoli na dołączanie częstotliwości komórek, jak również procentów komórek w tej samej tabeli komórek dla Sweave? W każdym razie dzięki za twoją przydatną odpowiedź. – MYaseen208

+2

Można połączyć te dwie macierze z "mapply", i wyraźnie przekształcić powstały wektor w macierz: 'm1 <- apply (m, 2, as.character); m2 <- zastosuj (prop.table (m, 1) * 100, 2, funkcja (u) sprintf ("%. 1f %%", u)); m3 <- mapply (paste, m1, "(", m2, ")", sep = ""); m3 <- matrix (m3, nr = nrow (m)); m3'. Jednak, aby zachować wyrównanie w tabeli, prawdopodobnie użyłbym pętli, aby wyraźnie napisać kod LaTeX dla tabeli. –

8

Innym rozwiązaniem może zastępować zawartość Matrix

m2 <- m 
m2[] <- sprintf("%.1f%%",round(prop.table(m,1)*100, 3)) 
m2 
# C  D  
# A "25.0%" "75.0%" 
# B "33.3%" "66.7%" 
+0

Ładne rozwiązanie. Można uzyskać to samo rozwiązanie przez to 'm2 [] <- sprintf ("%. 1f %% ", prop.table (m, 1) * 100)' too. Dzięki – MYaseen208

+1

Lub nawet 'replace (m, TRUE, sprintf ("%. 1f %% ", prop.table (m, 1) * 100))' –

+0

@ G.Grothendieck Zapomniałem o tej funkcji. I 'replace (m,, sprintf ("%. 1f %% ", prop.table (m, 1) * 100))' działa również. – Marek

Powiązane problemy