我有以下模拟data.frame:
(请注意我已经重写了大部分问题,反映了akrun对我最初问题的回答)
set.seed(22)
df <- data.frame(f1 = rep("a", 20), f2 = factor(sample(c("yes", "no", "maybe", "maybenot"), 20, replace = T)), f3 = factor(sample(c("yes", "no"), 20, replace = T)), f4 = factor(sample(c("yes", "no"), 20, replace = T)))
f1 f2 f3 f4
1 a maybe yes yes
2 a no yes yes
3 a yes no no
4 a maybe yes no
5 a maybe no yes
6 a maybenot no yes
...
我想在yes
中排除不显示df$f2
的所有行,并在no
中显示df$f3
,或df$f4
。如果我手动将值转换为0和1(yes
中除df$f2
之外的所有内容都为0),我可以按照akrun的建议使用rowSums
。我目前的解决方案是引入一个名为df$exclude
的虚拟列,如下所示,然后subset
上的df$exclude
:
df$exclude <- "no"
df[df$f2 != "yes" | df$f3 == "no" | df$f4 == "no",]$exclude <- "yes"
df <- subset(df, exclude == "no")
这可以更简洁地完成,例如没有事先转换列f2,f3和f3,或者使用lapply
(以某种方式与subset
结合,可能还有匿名函数)?
提前感谢您的回答。
答案 0 :(得分:1)
如果我们需要exclude
行为&#39; f2&#39;,&#39; f3&#39;和&#39; f4&#39;,只需rowSums
创建逻辑vector
和subset
数据集
subset(df, rowSums(df[2:4]!=0) != 0)
根据OP的帖子中的更新
df[!rowSums(df[2:4] != "yes"),]