如何找到一个data.table含有我有一个data.table查询矢量
问题描述:
最匹配的行状如何找到一个data.table含有我有一个data.table查询矢量
library(data.table)
ffDummy_dt = data.table(Annotation=c("chr10:10..20,-", "chr10:25..30,-"
,"chr10:35..100,-","chr10:106..205,-","chr10:223..250,-","chr10:269..478,-"
,"chr10:699..1001,-","chr10:2000..2210,-","chr10:2300..2500,-"
,"chr10:2678..5678,-"),tpmOne=c(0,0,0.213,1,1.2,0.5,0.7,0.9,0.8,0.86),
tpmTwo=c(100,1000,1001,1500,900,877,1212,1232,1312,0),tpmThree=c(0.2138595,0,0,0
,0,0,0.6415786,0,0,0))
我想通过一个查询(可以是向量,甚至数据。表如果需要)如:
test_v = c(0,0,0.86)
我想找出哪一行是最好的匹配。
在我的真实使用案例中,test_v类似于20个元素,而nrow(Dummy_dt)是>> 20(但可能每个20元素向量只有一个完美匹配)。
目前,
which.max(apply(as.matrix(ffDummy_dt[,2:ncol(ffDummy_dt),with=F]), 1,
function(k) sum(test_v%in%k)))
似乎工作(给在这种情况下,这是10正确的输出),但是这不是一个data.table解决方案。
我看了一下here,但不能完全弄清楚如何在data.table上面使用%in% k
。
答
假设你真正想要的比赛是排他的(在我看来,更有意义的一排是“最佳匹配”),你可以这样做:
Reduce(`+`, lapply(ffDummy_dt, `%in%`, test_v))
#[1] 1 2 1 1 1 1 0 1 1 3
所以你说的'test_v'中元素的顺序没有区别?如果是这样,那是一个混乱的问题。 – Frank
这就是我要说的。 – Atticus29
好吧,我猜你会遇到很多困难。首先,尝试使用'.1 + .2 == .3',然后阅读http://*.com/q/9508518/。如果您正在寻找整数或字符串或其他东西,这将是可行的。 – Frank