我的数据集如下(部分):
id name dummy
1 Jane 1
1 Jane 0
1 Jane 1
2 Mike 0
2 Mike 0
2 Mike 0
2 Mike 0
2 Mike 0
3 Tom 1
3 Tom 1
3 Tom 0
3 Tom 0
我正在尝试消除所有变量dummy
为0的人。例如,Tom
和Jane
不会被删除,因为它们有{{1}变量0或1,但dummy
将被删除,因为他的全0。所以我最终想要
Mike
我考虑过根据 id name dummy
1 Jane 1
1 Jane 0
1 Jane 1
3 Tom 1
3 Tom 1
3 Tom 0
3 Tom 0
对数据框进行排序,但我似乎无法弄清楚如何处理这样一个事实:我只是试图消除那些只有0变量值的人dummy
。任何建议都会非常有用!
答案 0 :(得分:3)
考虑df
是您的data.frame,然后使用tapply
和[
对您想要的内容进行分组:
> ind <- with(df, tapply(dummy, name, sum))
> df[df$name %in% names(ind)[ind!=0], ]
id name dummy
1 1 Jane 1
2 1 Jane 0
3 1 Jane 1
9 3 Tom 1
10 3 Tom 1
11 3 Tom 0
12 3 Tom 0
另一种选择:
> result <- split(df, df$name)[with(df, tapply(dummy, name, function(x) sum(x)!=0))]
> do.call(rbind, result)
答案 1 :(得分:2)
可能的解决方案:
subset(dat, as.logical(ave(dummy, id, FUN = any)))
# id name dummy
# 1 1 Jane 1
# 2 1 Jane 0
# 3 1 Jane 1
# 9 3 Tom 1
# 10 3 Tom 1
# 11 3 Tom 0
# 12 3 Tom 0
data.table
的替代方案:
library(data.table)
setDT(dat)[, if (any(dummy)) .SD, by = id]
或dplyr
:
library(dplyr)
dat %>%
group_by(id) %>%
filter(any(dummy))
答案 2 :(得分:1)
ave
可用于生成分组总和,同时保持原始位置:
x[with(x, ave(dummy, name, FUN=sum))>0,]
## id name dummy
## 1 1 Jane 1
## 2 1 Jane 0
## 3 1 Jane 1
## 9 3 Tom 1
## 10 3 Tom 1
## 11 3 Tom 0
## 12 3 Tom 0
ave
类似于aggregate
,但会复制集合中每行的聚合值:
with(x, ave(dummy, name, FUN=sum))
## [1] 2 2 2 0 0 0 0 0 2 2 2 2
答案 3 :(得分:1)
您也可以使用plyr::ddply
require(plyr)
ddply(df, .(name), function(x) subset(x, !all(dummy == 0)))
## id name dummy
## 1 1 Jane 1
## 2 1 Jane 0
## 3 1 Jane 1
## 4 3 Tom 1
## 5 3 Tom 1
## 6 3 Tom 0
## 7 3 Tom 0
请注意,可以将!all(dummy == 0)
替换为any(dummy != 0)