根据另一个数据框中的列值选择一个数据框中的行?

时间:2016-02-15 13:59:59

标签: r list dataframe

我有两个数据帧

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

给了我带有&lt; 0行&gt;的colnames(df1)。 (或0长度的row.names)

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

1 个答案:

答案 0 :(得分: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)