2016-08-08 4 views
3

У меня относительно большой набор данных, и я хочу напечатать таблицу средних значений и стандартные отклонения для комбинаций факторов. Я хотел бы иметь их в таком формате:Таблица средних значений (SD) s

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

Есть ли простой способ сделать это?

Ближайший я получаю использует функцию tables::tabular (минимальный пример):

# 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) 

... который выводит это:

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

Но я не понял, аккуратный путь к преобразуйте этот формат в формат mean (SD). Примечание. Эти примеры очень минимальны. У меня будет большая иерархия (в настоящее время 4 столбца x (средний + sd) и 2 x 3 строки), но основная проблема одна и та же.

+0

Возможно, вы должны сделать пример, включающий 'test' var. – Frank

ответ

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) 

Подобный ответ Криса, но (нужно и не переменный "тест") немного чище.

Вы также можете сделать этот тип агрегации с пакетом dplyr.

+1

Спасибо, @Frank, я отредактировал соответственно. – jdobres

+0

вам не нужна тестовая переменная, но она была в его рамке с образцом в начале ... Как и 'sprintf', хотя! – Chris

+0

Спасибо, это галочка! Теперь я вижу, что в моем примере я был слишком маленьким. На самом деле, у меня есть test1 и test2 как отдельные * столбцы * в моем data.frame, а не как уровни в коэффициенте. 'dcast' принимает только один' value.var' - или есть способ? Я всегда мог «расплавиться» перед вызовом «dcast». –

2

С data.table, мы можем использовать dcast (включая тестовый вар):

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, вы используете 'dcast' из пакета reshape2; может загрузить этот пакет. – Frank

 Смежные вопросы

  • Нет связанных вопросов^_^