2016-07-08 4 views
0

Я пытаюсь разделить фрейм данных на основе participant_number, затем рассчитать среднее значение конкретных столбцов Happiness и Joy (исключая столбец Lolz). Почему принимая среднее значение столбца означает результат:Как вычислить среднее из сгруппированных данных?

Warning messages: 
1: In mean.default(function (x, na.rm = FALSE, dims = 1L) : 
    argument is not numeric or logical: returning NA 
2: In mean.default(function (x, na.rm = FALSE, dims = 1L) : 
    argument is not numeric or logical: returning NA 

Мой код:

library(dplyr) 
df<-data.frame(participant_number=c(1,1,1,2,2),Happiness=c(3,4,2,1,3),Joy=c(1,2,3,5,4),Lolz=c(3,3,3,3,3)) 

df%>%group_by(participant_number)%>% 
select(Happiness,Joy)%>% 
mutate(emoMean=mean(colMeans)) 

> df 
    participant_number Happiness Joy Lolz 
1     1   3 1 3 
2     1   4 2 3 
3     1   2 3 3 
4     2   1 5 3 
5     2   3 4 3 

ЗАДАЧА

emoMean 
participant_number ... emoMean 
1      2.5 (3+1+4+2+2+3)/6 #Note that this value does not include participant_number 
1      2.5 
1      2.5 
2      6.5 
2      6.5 

Примечания:

Я пытался следовать this в виде потенциальное решение, но полностью потеряно

ответ

2

Для вашего конкретного случая, вы можете просто добавить две колонки вместе, взять среднее, а затем разделить его на два, так как две колонны всегда имеют один и тот же счет:

df %>% group_by(participant_number) %>% mutate(emoMean = mean(Happiness + Joy)/2) 

Source: local data frame [5 x 5] 
Groups: participant_number [2] 

    participant_number Happiness Joy Lolz emoMean 
       <dbl>  <dbl> <dbl> <dbl> <dbl> 
1     1   3  1  3 2.50 
2     1   4  2  3 2.50 
3     1   2  3  3 2.50 
4     2   1  5  3 3.25 
5     2   3  4  3 3.25 

Примечание: в среднем время, по вашему определению среднего для первой группы, я думаю, что для второй группы это должно быть 3,25 вместо 6.5.

1

Альтернатива plyr:

df<data.frame(participant_number=c(1,1,1,2,2),Happiness=c(3,4,2,1,3),Joy=c(1,2,3,5,4),Lolz=c(3,3,3,3,3)) 

df$mean <- ave(apply(df[,2:3],1,mean, na.rm=TRUE), df$participant_number) 
1

Мы можем использовать data.table

library(data.table) 
setDT(df)[, emoMean := mean(Happiness + Joy)/2 , by = participant_number] 

Если есть много столбцов, чтобы сделать sum, один вариант Reduce

nm1 <- names(df)[2:3] 
setDT(df)[, emoMean := Reduce(`+`, .SD)/length(nm1), 
        by = participant_number, .SDcols = nm1]