我在data.table表单中有两个数据帧。其中一个是分组数据,我希望从第二个data.table框架中提取值的索引。以下是样本数据
snp_bygene<-data.table(V2=c("SNP1","SNP2","SNP3","SNP4","SNP5","SNP11","SNP12","SNP13","SNP14","SNP15"),
GENE=c( rep("GENE1",5),rep("GENE2",5) ),START=c(rep(100,5),rep(200,5)),END=c(rep(190,5),rep(290,5)) )
snp_data<-data.table(V2=c("SNP1","SNP2","SNP3","SNP4","SNP5","SNP11","SNP12","SNP13","SNP14","SNP15"),BP=c(101,102,105,110,125,201,202,205,210,225))我想为V2在snp_bygene中获得snp_data V2匹配的索引。每一个基因我想得到SNP的位置。
setkey(snp_data, V2)
snp_bygene[snp_data]我该怎么做?
最后的输出如下:
finalindex_perGene<-list("GENE1"=c(1, 2, 3, 4, 5) , "GENE2" =c(6, 7, 8, 9, 10))
编辑1:在GENE中没有snp_data组
发布于 2021-01-14 18:28:10
我们可以做一个非equi连接on 'START‘、'END’列与'BP‘和equi连接'V2',获得带有.I的行索引,在list中追加'GENE’列,然后在list中添加‘split .I’(I是为.I创建的默认列名,因为我们没有指定任何列名--它可以由.(I = .I, GENE)显式表示),由‘split’表示。
with(snp_bygene[snp_data, .(.I, GENE), on = .(V2, START <= BP,
END >= BP)], split(I, GENE))-output
#$GENE1
#[1] 1 2 3 4 5
#$GENE2
#[1] 6 7 8 9 10发布于 2021-01-14 20:22:54
如果不涉及BP合并数据表(即,仅取决于V2 ),我们可以使用chmatch获取匹配的行索引,例如,
> with(snp_bygene, split(chmatch(snp_bygene[, V2], snp_data[, V2]), GENE))
$GENE1
[1] 1 2 3 4 5
$GENE2
[1] 6 7 8 9 10否则,您可能需要非equi和equi连接作为@akrun did。
https://stackoverflow.com/questions/65724707
复制相似问题