细分规则 [英] The rules of subsetting

查看:16
本文介绍了细分规则的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

具有df1df2如下:

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)

我可以向数据索要一大堆东西,比如:

 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

数据之间。帧:

 df1[ df1$z %in% df2$c ,] # rows in df1 where values in z are in c (allrows)

这将显示所有行:

 df1[ (df1$x %in%  df2$a) &
      (df1$y %in%  df2$b) &
      (df1$z %in%  df2$c) ,]

但这不应该也给我df1的所有行:

 df1[ df1$z %in% df2$c | df1$b == 9,]
我真正希望做的是在三个列条件下对Andf1Andf2进行子集, 所以我只得到df1中的行,其中a,b,c在一行中同时等于x,y,z。在实际数据中,我将有3列以上,但我仍希望在3个附加列条件上设置子集。

因此在df2上子设置我的示例数据df1我的结果将是:

df1
   1 1 1
   1 1 2

玩弄语法让我更加困惑,so帖子都是我想要的东西,实际上会给我带来更多念力。

我想我可以做到:

 merge(df1,df2, by.x=c("x","y","z"),by.y=c("a","b","c"))

这给了我想要的,但我想知道为什么我的[尝试是错误的。

推荐答案

除了使用merge(感谢您,我总是忘记merge)很好的解决方案之外,还可以使用?interaction在base中实现这一点,如下所示。可能还有其他变体,但这是我熟悉的一个:

> df1[interaction(df1) %in% interaction(df2), ]

现在回答您的问题:首先,我认为中有一个拼写错误(已更正):

df1[ df1$z %in% df2$c | df2$b == 9,] # second part should be df2$b == 9

您将收到错误,因为第一部分的计算结果为

[1] TRUE TRUE TRUE TRUE TRUE

第二个求值为:

[1] FALSE FALSE FALSE FALSE

您对不等长执行|操作,得到错误:

longer object length is not a multiple of shorter object length

编辑:如果您有多个列,则可以这样选择交互。例如,如果要从df1获取前两列与df2匹配的行,则只需执行以下操作:

> df1[interaction(df1[, 1:2]) %in% interaction(df2[, 1:2]), ]

这篇关于细分规则的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆