如何根据列值条件选择行

时间:2013-12-27 22:34:41

标签: r

我的数据集如下(部分):

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的人。例如,TomJane不会被删除,因为它们有{{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。任何建议都会非常有用!

4 个答案:

答案 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)