有人可以在这里解释我做错了什么:
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
如何让平均值达到我的预期?
答案 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))