【发布时间】:2016-06-23 15:54:24
【问题描述】:
这个问题适合理解 group_by 函数的正确功能。
假设我有一个数据框,其中包含 5 个二进制变量(这些变量的含义并不重要)和一个代表一些用户的变量 id。例如:
id<- c("A","A" , "B" , "B")
d<- as.data.frame(id)
d$d1<- c(1,0,1,0)
d$d2<- c(1,0,1,0)
d$d3<- c(0,1,1,0)
d$d4<- c(0,1,0,1)
d$d5<- c(0,1,0,0)
> d
id d1 d2 d3 d4 d5
1 A 1 1 0 0 0
2 A 0 0 1 1 1
3 B 1 1 1 0 0
4 B 0 0 0 1 0
我将构造一个函数,该函数能够检查每个用户 A 和 B,变量 d1 到 d5 是否都包含 1。
verificator<- function(d )
{
r<- prod(apply(d[,2:6],2, sum))
r<- as.logical(r)
return(r)
}
例如,对于A用户,d1到d5中的每一个,都有第一个。
verificator(d[1:2,])
[1] TRUE
但是,对于 B 用户,我们有
verificator(d[3:4,])
[1] FALSE
当我使用 dplyr 函数计算 d 矩阵时,出现了问题:
d2<- d %>% group_by(id) %>% summarise(one = verificator(.))
d2
Source: local data frame [2 x 2]
id one
1 A TRUE
2 B TRUE
为什么这会为 B 用户返回 TRUE?
【问题讨论】:
-
我不确定这是否是最优雅的,但我可能会这样做
d %>% group_by(id) %>% summarise_each(funs(sum)) %>% group_by(id) %>% summarise(one = as.logical(prod(d1:d5)))