R 如何过滤具有多个条件的数据帧?

R 如何过滤具有多个条件的数据帧?,r,dataframe,subset,dplyr,R,Dataframe,Subset,Dplyr,我有这个数据帧,我想将其子集(如果可能,使用dplyr或base R函数): 谢谢你的帮助!谢谢 你可以试试这个 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)) 如果您有多个“x”组,一个选项是使用mapply

我有这个数据帧,我想将其子集(如果可能,使用
dplyr
base R
函数):

谢谢你的帮助!谢谢

你可以试试这个

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

如果您有多个“x”组,一个选项是使用
mapply
。我们
使用'x'作为分组变量拆分'y',创建要与之比较的值向量(
c(15,5)
),并使用
mapply
获得用于子集'df'的逻辑索引

df[unlist(mapply('>', split(df$y, df$x), c(15,5))),]
#  x  y
#1 1 30
#4 2 10
#5 2 18

谢谢
dplyr
解决方案运行良好。但是我并不真正理解
with()
解决方案。
with()
函数做什么?
with
允许您直接使用变量的名称,而无需写入
df$x
。您可以使用
附件
执行类似操作。啊,谢谢!现在我记得我以前用过
,但完全忘记了,因为我几乎不用它。再次感谢!谢谢@akrun!虽然我更喜欢上面的
dplyr
解决方案,因为它更容易理解,但您的
mappy
解决方案也相当简洁,但我不完全理解
mappy
在这里是如何工作的。你能解释一下mapply('>',split(df$y,df$x),c(15,5))是什么意思吗?非常感谢@hsl是的,
dplyr
和另一个解决方案在这里很简单。但是,我将此(:-)用于大量组,即,如果您有100个唯一值,并且每个“x”有100个值要与
y
元素进行比较,那么
mappy
将比较相应的列表元素(
split
的输出)和相应的向量元素(
c(15,5)
)使用
。感谢您的解释。我在玩代码时意识到,如果每个“x”值的数字不同,例如
data.frame(x=c(1,1,1,2,2,2),y=c(30,10,8,10,18,5,9))
(三个1和四个2)。这是因为要使其工作,
mapply
必须返回数据帧,而不是列表@akrun@hsl您必须使用
unlist
。我认为它适用于大多数情况。
df[unlist(mapply('>',split(df$y,df$x),c(15,5)),]
在提供的示例中,长度是相等的,因此
mapply
将结果强制为
矩阵
,而在这里它保持为
列表
。因此,最好使用
未列表
很好,这很有意义。非常感谢!@akrun
library(dplyr)
filter(df, (x==1 & y>15) | (x==2 & y>5))
df[unlist(mapply('>', split(df$y, df$x), c(15,5))),]
#  x  y
#1 1 30
#4 2 10
#5 2 18