2012-02-07 11 views
6

Estoy intentando agregar% sign en la salida de prop.table para usar en Sweave. Mi intento de código es el siguiente:Adjuntar% iniciar sesión en la salida de 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%" 

Usando paste va a cambiar la clase de la matriz de caracteres. Apreciaría mucho si alguien me guía la solución correcta. Gracias

Respuesta

5

mayoría de las funciones diseñadas para trabajar con vectores también aceptar matrices, pero devolver un vector en lugar de una matriz: paste, sprintf, etc. Puede utilizar apply, que devolverá una matriz.

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

(+1): Gracias @Vincent. Esto es lo que estaba buscando. ¿Tiene alguna función que permita agregar las frecuencias de las celdas, así como los porcentajes de celdas en la misma tabla de celdas para Sweave? De todos modos, gracias por tu útil respuesta. – MYaseen208

+2

Puede concatenar las dos matrices con 'mapply', y convertir explícitamente el vector resultante en una matriz:' m1 <- apply (m, 2, as.character); m2 <- apply (prop.table (m, 1) * 100, 2, función (u) sprintf ("%. 1f %%", u)); m3 <- mapply (pegar, m1, "(", m2, ")", sep = ""); m3 <- matriz (m3, nr = nrow (m)); m3'. Sin embargo, para preservar la alineación en la tabla, probablemente usaría un bucle para escribir explícitamente el código LaTeX para la tabla. –

8

Otra solución podría ser la sustitución de contenido de la matriz:

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

Buena solución. Puede obtener la misma solución con este 'm2 [] <- sprintf ("%. 1f %% ", prop.table (m, 1) * 100)' también. Gracias – MYaseen208

+1

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

+0

@ G.Grothendieck Me olvidé de esta función. Y 'replace (m, sprintf ("%. 1f %% ", prop.table (m, 1) * 100))' también funciona. – Marek

Cuestiones relacionadas