比较两个数据框并删除具有相同字符的行。

3

我有两个数据框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 
1个回答

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

或者用length(intersect(x,y))==0替换!any(x %in% y)

注意: 如果“基因”列是“factor”,将其转换为“character”,因为strsplit不能处理'factor'类。 即strsplit(as.character(x1$Genes, ','))

更新

基于新的“x2”数据集,我们可以通过“chr”列合并两个数据集,从输出数据集(“xNew”)中strsplit 'Genes.x'、'Genes.y',在'Genes.y'字符串中查找任何一个元素是否出现在'Genes.x'中,并使用该索引来对子集'x2'数据集进行操作。

 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

akrun,如果两个数据框的长度不同怎么办?我已经更新了示例。 - Kryo
@Kryo 使用新的示例更新了帖子。 - akrun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接