【问题标题】:The rules of subsetting子集化规则
【发布时间】:2013-01-30 11:53:09
【问题描述】:

拥有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

data.frame 之间:

 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,]

我真正希望做的是在三列条件下对df1df2 进行子集化, 这样我只能在 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"))

这给了我想要的东西,但我想了解为什么我在[ 尝试中错了。

【问题讨论】:

    标签: r dataframe subset


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-27
      • 1970-01-01
      • 1970-01-01
      • 2020-02-02
      • 2014-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多