如果至少有一个组成员满足条件,则从 data.frame 中删除组

标签 r subset plyr

我有一个 data.frame,如果其中的任何成员满足条件,我希望删除整个组。

在第一个示例中,如果值是数字并且条件是NA,则下面的代码有效。

df <- structure(list(world = c(1, 2, 3, 3, 2, NA, 1, 2, 3, 2), place = c(1, 
1, 2, 2, 3, 3, 1, 2, 3, 1), group = c(1, 1, 1, 2, 2, 2, 3, 
3, 3, 3)), .Names = c("world", "place", "group"), row.names = c(NA, 
-10L), class = "data.frame")

ans <- ddply(df, . (group), summarize, code=mean(world))
ans$code[is.na(ans$code)] <- 0
ans2 <- merge(df,ans)
final.ans <- ans2[ans2$code !=0,]

但是,如果条件不是“NA”,或者如果值是非数字的。

例如,如果我想删除具有 world 值为 AF 的一行或多行的组(如下面的数据框中所示),则此 ddply 技巧不起作用。

df2 <-structure(list(world = structure(c(1L, 2L, 3L, 3L, 3L, 5L, 1L, 
4L, 2L, 4L), .Label = c("AB", "AC", "AD", "AE", "AF"), class = "factor"), 
    place = c(1, 1, 2, 2, 3, 3, 1, 2, 3, 1), group = c(1, 
    1, 1, 2, 2, 2, 3, 3, 3, 3)), .Names = c("world", "place", 
"group"), row.names = c(NA, -10L), class = "data.frame")

我可以设想一个 for 循环,其中对于每个组,检查每个成员的值,如果满足条件,则可以填充 code 列,然后我可以根据在该代码上。

但是,也许有一种矢量化的方法可以做到这一点?

最佳答案

尝试

library(dplyr)
df2 %>%
  group_by(group) %>%
  filter(!any(world == "AF"))

或者按照@akrun提到的:

setDT(df2)[, if(!any(world == "AF")) .SD, group]

或者

setDT(df2)[, if(all(world != "AF")) .SD, group]

这给出:

#Source: local data frame [7 x 3]
#Groups: group
#
#  world place group
#1    AB     1     1
#2    AC     1     1
#3    AD     2     1
#4    AB     1     3
#5    AE     2     3
#6    AC     3     3
#7    AE     1     3

关于如果至少有一个组成员满足条件,则从 data.frame 中删除组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31661704/

相关文章:

r - 需要格式化 x 轴组标签以使其不重叠的支持

r - 更改 stat_binhex 中的计数范围

r - 如何用R中的另一个字符串替换由开始和结束索引定义的字符串?

perl,比较散列,子集

r - 按条件对数据进行子集化

r - 函数不能嵌入到另一个函数中

r - 基于引用表中日期的子集

r - 在 R 中加速 wilcox.test

MySQL 选择 MySQL 结果子集中最接近的匹配

r - 如果我的分组变量是一个因素,我如何生成按组汇总的统计数据?