我有两个data.frame x1& X2。如果在x1和x2
中找到共同的基因,我想从x2中删除行x1 <- chr start end Genes
1 8401 8410 Mndal,Mnda,Ifi203,Ifi202b
2 8001 8020 Cyb5r1,Adipor1,Klhl12
3 4001 4020 Alyref2,Itln1,Cd244
x2 <- chr start end Genes
1 8861 8868 Olfr1193
1 8405 8420 Mrgprx3-ps,Mrgpra1,Mrgpra2a,Mndal,Mrgpra2b
2 8501 8520 Chia,Chi3l3,Chi3l4
3 4321 4670 Tdpoz4,Tdpoz3,Tdpoz5
x2 <- chr start end Genes
1 8861 8868 Olfr1193
2 8501 8520 Chia,Chi3l3,Chi3l4
3 4321 4670 Tdpoz4,Tdpoz3,Tdpoz5
答案 0 :(得分:3)
你可以尝试
x2[mapply(function(x,y) !any(x %in% y),
strsplit(x1$Genes, ','), strsplit(x2$Genes, ',')),]
# chr start end Genes
#2 2 8501 8520 Chia,Chi3l3,Chi3l4
#3 3 4321 4670 Tdpoz4,Tdpoz3,Tdpoz5
或将!any(x %in% y)
替换为length(intersect(x,y))==0
。
注意:如果“基因”列是“因子”,请将其转换为“字符”,因为strsplit
不能采用“因子”类。即strsplit(as.character(x1$Genes, ','))
基于'x2'的新数据集,我们可以通过'chr'列merge
strsplit
两个数据集, xNew <- merge(x1, x2[,c(1,4)], by='chr')
indx <- mapply(function(x,y) any(x %in% y),
strsplit(xNew$Genes.x, ','), strsplit(xNew$Genes.y, ','))
x2[!indx,]
# chr start end Genes
#1 1 8861 8868 Olfr1193
#3 2 8501 8520 Chia,Chi3l3,Chi3l4
#4 3 4321 4670 Tdpoz4,Tdpoz3,Tdpoz5
输出'Genes.x','Genes.y'数据集('xNew'),根据'Genes.y'字符串中'Genes.x'的任何元素的出现获取逻辑索引,使用它来对'x2'数据集进行子集
{{1}}