按名称在另一个数据框中对数据框进行子集

时间:2016-02-15 19:22:13

标签: r

我有一个非常大的参考文件,在成千上万个对象(" OTU)之间进行了成千上万的成对比较。数据框格式为长格式:

data.frame':    14845516 obs. of  3 variables:
 $ OTU1   : chr  "0" "0" "0" "0" ...
 $ OTU2   : chr  "8192" "1" "8194" "3" ...
 $ gendist: num  78.7 77.8 77.6 74.4 75.3 ...

我的观察数据也有一个小得多的子集(结构略有不同):

'data.frame':   286903 obs. of  3 variables:
 $ OTU1   : chr  "1239" "1603" "2584" "1120" ...
 $ OTU2   : chr  "12136" "12136" "12136" "12136" ...
 $ ecodist: num  2.08 1.85 2 1.73 1.53 ...
 - attr(*, "na.action")=Class 'omit'  Named int [1:287661] 1 759 760 1517 1518 1519 2275 2276 2277 2278 ...
  .. ..- attr(*, "names")= chr [1:287661] "1" "759" "760" "1517" ...

再次,它是对象的成对比较(' OTUs')。较小数据集中的所有对象也位于参考数据集中。

我想减少它只包含在较小数据集中找到的对象的引用。在两列(OTU1,OTU2)上完成它是非常重要的。

这是玩具数据:

library(reshape)
###reference
Ref <- cor(as.data.frame(matrix(rnorm(100),10,10)))
row.names(Ref) <- colnames(Ref) <- LETTERS[1:10]
Ref[upper.tri(Ref)] <- NA
diag(Ref) <- NA
Ref.m <- na.omit(melt(Ref, varnames = c('row', 'col')))
###query
tmp <- cor(as.data.frame(matrix(rnorm(25),5,5)))
row.names(tmp) <- colnames(tmp) <- LETTERS[1:5]
tmp[upper.tri(tmp)] <- NA
diag(tmp) <- NA
tmp.m <- na.omit(melt(tmp, varnames = c('row', 'col')))

1 个答案:

答案 0 :(得分:1)

以下适用于我使用您的玩具数据:

Ref[rownames(tmp), colnames(tmp)]

这将(仅通过名称)选择Ref中的那些行,这些行的名称也是tmp中行的名称,对于列也是如此。

如果你想在问题的第一部分的str输出中坚持使用长格式,你可以使用类似的东西:

data1[(data1$OTU1 %in% data2$OTU1) & (data1$OTU2 %in% data2$OTU2), ]

在这里,我创建了一个逻辑向量,用于指示参考数据框(data1)的哪些行在OTU1中的某个位置data2$OTU1条目,OTU2的相同内容{1}}。然后使用所述逻辑向量来选择data1的行。