2016-08-08 4 views
3

J'ai un ensemble de données relativement volumineux et je souhaite imprimer un tableau des moyennes et des écarts-types pour les combinaisons de facteurs. Je voudrais les avoir dans un format comme celui-ci:Tableau des moyennes (SD) s

  A   B 
test1 2.0 (1.0) 5.0 (2.0) 
test2 6.3 (3.1) 2.1 (0.7) 

Y at-il un moyen facile de le faire?

Le plus proche que je reçois utilise la fonction tables::tabular (exemple minimal):

# Example data 
df = data.frame(
    group=c('A', 'A', 'A', 'B', 'B', 'B'), 
    value=c(1,2,3,6,8,9)) 

# Print table  
library(tables) 
tabular(value ~ group * (mean + sd), df) 

... qui sort ceci:

 group    
     A  B   
     mean sd mean sd 
value 2  1 7.667 1.52 

Mais je ne l'ai pas compris une belle façon transformez ce format au format mean (SD) ci-dessus. Note: Ces exemples sont très minimes. J'aurai une plus grande hiérarchie (actuellement 4 colonnes (moyenne + sd) et 2 x 3 lignes) mais le problème fondamental est le même.

+0

Vous devriez probablement faire un exemple qui inclut le 'test' var. – Frank

Répondre

2
library(reshape2) 

formatted.table <- dcast(df, 'value' ~ group, fun.aggregate = function(x) { 
    return(sprintf('%0.1f (%0.1f)', mean(x), sd(x))) 
}) 

# "value"   A   B 
# value 2.0 (1.0) 7.7 (1.5) 

similaires à la réponse de Chris, mais un peu peu plus propre (et non variable "test" est nécessaire).

Vous pouvez également effectuer ce type d'agrégation avec le package dplyr.

+1

Merci, @Frank, j'ai modifié en conséquence. – jdobres

+0

vous n'avez pas besoin de la variable de test, mais c'était dans son exemple au début ... Comme le 'sprintf' cependant! – Chris

+0

Merci, cela fait la tique! Je peux voir maintenant que j'étais un peu trop minime dans mon exemple. En fait, j'ai les test1 et test2 séparément * colonnes * dans mon data.frame, pas en tant que niveaux dans un facteur. 'dcast' ne prend qu'un' value.var' - ou y a-t-il un moyen? Je pourrais toujours faire une «fusion» avant d'appeler 'dcast'. –

2

De data.table, nous pouvons utiliser dcast (y compris votre test var):

library(data.table) 

df = data.frame(
    group=c('A', 'A', 'A', 'B', 'B', 'B','A', 'A', 'A', 'B', 'B', 'B'), 
    value=c(1,2,3,6,8,9,1,2,3,6,8,9), 
    test=c(1,1,1,1,1,1,2,2,2,2,2,2)) 

dcast(df, test ~ group, fun.aggregate = function(x){ 
    paste(round(mean(x),1)," (", round(sd(x),1),")", sep = "") 
}) 
    test  A   B 
1 1 2 (1) 7.7 (1.5) 
2 2 2 (1) 7.7 (1.5) 
+0

Fyi, vous utilisez 'dcast' du paquet reshape2 là; peut charger ce paquet à la place. – Frank