我有一个非常大的参考文件,在成千上万个对象(" 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')))
答案 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
的行。