2015-07-22 1 views
1

У меня есть набор данных, который имеет ряд идентификаторов и действий, а также множество столбцов наблюдений для каждой комбинации идентификаторов и активности. Я хотел бы усреднить каждое наблюдение, но, поскольку есть сотни и сотни наблюдений, я не понимаю, как действовать дальше.В среднем более сотни столбцов с суммированием?

Пример данных:

id,activity,obs1,obs2,obs3 
1,1,325,6432,5432 
1,2,321,214,2143 
1,3,3652,123,123 
2,1,5321,123,643 
2,2,4312,4321,432 
2,3,522,123,321 
1,1,532,765,8976 
1,2,142,865,5445 
1,3,643,654,53 
2,1,756,765,7865 
2,2,876,654,976 
2,3,6754,765,987 

То, что я пытался до сих пор:

library(dplyr) 
example <- read.table("clipboard",sep=",",header=T) 
group <- group_by(example,id,activity) 
summarize(group, mobs1=mean(obs1), mobs2=mean(obs2), mobs3=mean(obs3)) 

который получает мне правильную форму, но как я могу идти о summarize() без ввода mobsN=mean(obsN) сотни раз ? Я чувствую, как применить функцию будет идти здесь, но я не уверен, ...

+0

проверки 'summarise_each' – Jaap

ответ

3

Это должно дать вам желаемый результат:

library(dplyr) 
means.wide <- example %>% 
    group_by(id,activity) %>% 
    summarise_each(funs(mean)) 

Вы также можете конвертировать example в длинном формате, а затем вычислить средство:

library(dplyr) 
library(tidyr) 

means.long <- example %>% 
    gather(obs, val, -c(id,activity)) %>% 
    group_by(id,activity,obs) %>% 
    summarise(mean_val=mean(val)) 

Вы также могли бы сделать это с data.table пакета:

# compareble to the wide dplyr version 
library(data.table) 
setDT(example)[, lapply(.SD, mean), by=list(id,activity)] 

# compareble to the long dplyr version 
library(data.table) 
melt(setDT(example),id.vars=c("id","activity"))[, mean(value), by=list(id,activity,variable)] 

И не забывайте о старой доброй базы R?:

aggregate(. ~ id + activity, example, FUN = mean) 
+0

Если вы использовали' gather', вы просто должны быть оставлены с тремя столбцами (id, obs и val), так что вы не можете просто использовать 'summaryize (mean_val = mean (val))'? Или вы можете использовать 'summaryise_each', не используя сначала' gather'. –

+0

@ Ник Кеннеди, ты прав, я допустил ошибку; см. обновленный ответ – Jaap

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