【问题标题】:Select rows in one dataframe based on column values in another?根据另一个数据框中的列值选择一个数据框中的行?
【发布时间】:2016-02-15 13:59:59
【问题描述】:

我有两个数据框

df1

    i1 i2 i3
 p1 1  1  1
 p2 0  1  1
 p3 0  0  1  

df2

      p1 p2 p3
site1 0  0  1
site2 4  1  10
site3 15 0  0

现在我想为 df2 中的每个站点创建一个数据框列表。数据帧应仅包含来自 df1 且位于 df2 且大于 0 的行。

对于示例,我列表中的新 df 应该是这些:

site1:    i1 i2 i3
       p3 0  0  1


site2:     i1 i2 i3
        p1 1  1  1
        p2 0  1  1
        p3 0  0  1  

site3:     i1 i2 i3
        p1 1  1  1

除了列表问题之外,我无法让 R 在 df1 中选择正确的行。到目前为止我所做的是使用 %in%

 test<-df1[df1[,1] %in% (df2[1,-1]>0),]

这给了我 (或 0-length row.names)的 colnames(df1)

有人知道我哪里出错了吗?我不知道我是否可以以某种方式使用合并,因为我需要检查正确的 colname 和 >0 的值。

【问题讨论】:

    标签: r list dataframe


    【解决方案1】:

    我认为你应该which 而不是%in%。让我们定义一个函数,使用它对任何特定行执行此操作:

    foo = function(x, df1, df2) {
      df1[which(df2[x, ] > 0), ]
    }
    

    现在我们使用apply 对 df2 中的所有行执行上述功能。

    apply(matrix(1:nrow(df2)), 1, foo, df1 = df1, df2 = df2)
    

    【讨论】:

    • 非常感谢,效果很好。然而,我首先得到了一些奇怪的结果,在我查看它之后,我发现 df2 中的列没有按字母顺序排序。由于仅传递了数字而不是 df2[x,]>0 的特定列名,因此我得到了错误的结果(在订购它们后已修复)。如果有办法绕过这个问题,我只是徘徊?否则我必须检查 rownames(df1) 和 colnames(df2) 是否匹配(或相同)。这就是我从 %in% 运算符开始的原因,因为我认为它会查看实际的字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 2016-08-07
    • 2019-12-19
    • 1970-01-01
    • 2018-11-06
    相关资源
    最近更新 更多