拥有df1和df2如下:
df1 <- read.table(text =" x y z
1 1 1
1 2 1
1 1 2
2 1 1
2 2 2",header=TRUE)
df2 <- read.table(text =" a b c
1 1 1
1 2 8
1 1 2
2 6 2",header=TRUE)
Run Code Online (Sandbox Code Playgroud)
我可以问一些数据如下的数据:
df2[ df2$b == 6 | df2$c == 8 ,] #any rows where b=6 plus c=8 in df2
#and additive conditions
df2[ df2$b == 6 & df2$c == 8 ,] # zero rows
Run Code Online (Sandbox Code Playgroud)
data.frame之间:
df1[ df1$z %in% df2$c ,] # rows in df1 where values in z are in c (allrows)
Run Code Online (Sandbox Code Playgroud)
这给了我所有的行:
df1[ (df1$x %in% df2$a) &
(df1$y %in% df2$b) &
(df1$z %in% df2$c) ,]
Run Code Online (Sandbox Code Playgroud)
但是这不应该给我所有的行df1:
df1[ df1$z %in% df2$c | df1$b == 9,]
Run Code Online (Sandbox Code Playgroud)
我真的很希望能够做的是子集df1的df2三分的条件,所以,我只在DF1得到行,其中A,B,C都是平等的X,Y,Z在行内同一时间.在实际数据中,我将有超过3列,但我仍然希望在3个添加列条件上进行子集.
因此,df1在df2我的结果上对我的示例数据进行子集化将是:
df1
1 1 1
1 1 2
Run Code Online (Sandbox Code Playgroud)
使用语法更加困惑,SO帖子都是我想要的变化,这实际上会让我更加困惑.
我发现我可以这样做:
merge(df1,df2, by.x=c("x","y","z"),by.y=c("a","b","c"))
Run Code Online (Sandbox Code Playgroud)
这给了我想要的东西,但我想理解为什么我的[尝试错了.
除了使用你的好解决方案merge(感谢你,我总是忘记merge),这可以通过以下方式在base中实现?interaction.可能还有其他变体,但这是我熟悉的:
> df1[interaction(df1) %in% interaction(df2), ]
Run Code Online (Sandbox Code Playgroud)
现在回答你的问题:首先,我认为有一个错字(纠正):
df1[ df1$z %in% df2$c | df2$b == 9,] # second part should be df2$b == 9
Run Code Online (Sandbox Code Playgroud)
你会得到一个错误,因为第一部分的评估结果是
[1] TRUE TRUE TRUE TRUE TRUE
Run Code Online (Sandbox Code Playgroud)
第二个评估为:
[1] FALSE FALSE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)
您|在获取错误的不等长度上执行操作:
longer object length is not a multiple of shorter object length
Run Code Online (Sandbox Code Playgroud)
编辑:如果您有多列,则可以选择此类交互.例如,如果您想从前df1两列匹配的行中获取df2,那么您可以简单地执行以下操作:
> df1[interaction(df1[, 1:2]) %in% interaction(df2[, 1:2]), ]
Run Code Online (Sandbox Code Playgroud)