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