如何使用多个条件筛选数据框?

5

我有一个数据框,我想要用dplyrbase R函数来进行子集筛选:

df <- data.frame(x = c(1,1,1,2,2,2), y = c(30,10,8,10,18,5))

x  y
1 30
1 10
1  8
2 10
2 18
2  5

假设x是因子(即有2个条件/水平),我该如何对数据框进行子集/筛选,以便仅获取df$x == 1时大于15的df$y值,以及df$x == 2时大于5的df$y值?
这是我想要得到的结果:
df2 <- data.frame(x = c(1,2,2), y = c(30,10,18))

x y
1 30
2 10
2 18

感谢您的帮助!谢谢!
2个回答

2
如果您有多个'x'组,一种选择是使用mapply。我们使用'x'作为分组变量来split'y',创建要与之比较的值向量(c(15,5)),并使用mapply获取用于对'subsetting the df'进行逻辑索引。
df[unlist(mapply('>', split(df$y, df$x), c(15,5))),]
#  x  y
#1 1 30
#4 2 10
#5 2 18

谢谢 @akrun!虽然我更喜欢上面的 dplyr 解决方案,因为它更容易理解,但是您的 mapply 解决方案也相当不错,但我不完全明白 mapply 在这里的作用。 您能解释一下 mapply('>', split(df$y, df$x), c(15,5)) 的含义吗?非常感谢! - hsl
@hsl 是的,dplyr 和其他解决方案在这里都很好。但是,我要处理大量的组,比如说你有100个唯一值,并且有100个值要与每个“x”的y元素进行比较,那么mapply将使用>将相应的列表元素(split的输出)与相应的向量元素(c(15,5))进行比较。 - akrun
谢谢您的解释。我正在尝试编写代码,并意识到如果每个“x”值的数量不同,比如data.frame(x = c(1,1,1,2,2,2,2), y = c(30,10,8,10,18,5,9))(三个1和四个2),这种方法似乎无法工作。这是因为为了使其正常工作,mapply必须返回一个数据框,而不是列表吗?@akrun - hsl
@hsl 你必须使用unlist。我认为它适用于大多数情况。 df [unlist(mapply('>',split(df $ y,df $ x),c(15,5))),]在提供的示例中,长度相等,因此mapply将结果强制转换为matrix,而在此处,则保留为list。因此,最好使用unlist - akrun
太好了,现在明白了。非常感谢!@akrun - hsl
@hsl 没问题。很高兴能帮助你。 - akrun

1

你可以尝试这个

with(df, df[ (x==1 & y>15) | (x==2 & y>5), ])
  x  y
1 1 30
4 2 10
5 2 18

或者使用 dplyr
library(dplyr)
filter(df, (x==1 & y>15) | (x==2 & y>5))

谢谢!dplyr的解决方案非常好。但我不太理解with()的解决方案。with()函数是做什么用的? - hsl
with 允许你直接使用变量的名称,而不用写 df$x。 你也可以通过 attach 来实现类似的功能。 - Mamoun Benghezal
啊,谢谢!现在我记起来我以前用过 with,但是完全忘记了,因为我很少使用它。再次感谢! - hsl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接