dplyr返回每个组的全局均值,而不是每个组的平均值

时间:2017-02-06 03:15:43

标签: r dplyr

有人可以在这里解释我做错了什么:

library(dplyr)
temp<-data.frame(a=c(1,2,3,1,2,3,1,2,3),b=c(1,2,3,1,2,3,1,2,3))
temp%>%group_by(temp[,1])%>%summarise(n=n(),mean=mean(temp[,2],na.rm=T))

# A tibble: 3 × 3
  `temp[, 1]`     n  mean
        <dbl> <int> <dbl>
1           1     3     2
2           2     3     2
3           3     3     2

我希望手段是:

1  1
2  2
3  3

相反,均值似乎是全局均值(col 2中的所有值除以实例数)= 18/9 = 2

如何让平均值达到我的预期?

3 个答案:

答案 0 :(得分:3)

您的问题是您正在计算temp[,2]的平均值而不是组中的列(mean(temp[,2],na.rm=T)根本不依赖于上下文)。您需要执行以下操作:

> temp %>% group_by(temp[,1]) %>% summarise(n=n(), mean=mean(b, na.rm=T))
# A tibble: 3 × 3
  `temp[, 1]`     n  mean
        <dbl> <int> <dbl>
1           1     3     1
2           2     3     2
3           3     3     3

此外,更常见的是使用group_by中的列名:

> temp %>% group_by(b) %>% summarise(n=n(), mean=mean(b, na.rm=T))
# A tibble: 3 × 3
      b     n  mean
  <dbl> <int> <dbl>
1     1     3     1
2     2     3     2
3     3     3     3

答案 1 :(得分:1)

另一种方法是data.table

library(data.table)
setDT(temp)[, .(n = .N, mean = mean(b)), by = a]
#   a n mean
#1: 1 3    1
#2: 2 3    2
#3: 3 3    3

答案 2 :(得分:0)

始终记得在dplyr中使用列名。当您尝试通过索引而不是名称引用列时,您将遇到类似这样的问题。所以代替你使用的代码

temp%>%group_by(temp[,1])%>%summarise(n=n(),mean=mean(temp[,2],na.rm=T))

请尝试以下方法。给出预期结果

 temp%>%group_by(b)%>%summarise(n=n(),mean=mean(b))