2016-11-28 88 views
1

我在R中有两个数据帧:大和小。较小的一个包含在较大的一个中。重要的是,两个数据框中的每一行都没有唯一的标识符。我怎样才能得到如下:从R中较大的数据帧中减去一个较小的数据帧而没有唯一的行ID

大 - 小[大减去小]

小数据帧(SmallDF):

 ID  CSF1PO CSF1PO.1 D10S1248 D10S1248.1 D12S391 D12S391.1 
203079   10  11  14   16  -9  -9 
203079   8  12  14   17  -9  -9 
203080   10  12  13   13  -9  -9 

超大数据帧(BigDF):

 ID  CSF1PO CSF1PO.1 D10S1248 D10S1248.1 D12S391 D12S391.1 
203078   -9  -9  15   15  18  20 
203078   -9  -9  14   15  17  19 
203079   10  11  14   16  -9  -9 
203079   8  12  14   17  -9  -9 
203080   10  12  13   13  -9  -9 
203080   10  11  14   16  -9  -9 
203081   10  12  14   16  -9  -9 
203081   11  12  15   16  -9  -9 
203082   11  11  13   15  -9  -9 
203082   11  11  13   14  -9  -9  

小数据帧对应于较大数据帧的行3,4和5。

我试过以下。

BigDF[ !(BigDF$ID %in% SmallDF$ID), ] 

这不起作用,因为在任一行中都有唯一的标识符。我得到的输出和BigDF完全一样。

我也试过以下。

library(dplyr) 
setdiff(BigDF, SmallDF) 

我收到的输出和BigDF完全一样。

任何帮助,将不胜感激!谢谢。

回答

3
library(dplyr) 
anti_join(BigDF, SmallDF) 

这相当于:

anti_join(BigDF, SmallDF, by=c("ID", "CSF1PO", "CSF1PO.1", "D10S1248", "D10S1248.1", "D12S391", "D12S391.1")) 

很显然,如果你有两个变量,它唯一标识一行,您可以指定在传递给by矢量只是这些变量:

anti_join(BigDF, SmallDF, by=c("ID", "CSF1PO.1")) 
2

With base R:

BigDF[-which(duplicated(rbind(BigDF, SmallDF), fromLast = TRUE)),] 

带输出:

 ID CSF1PO CSF1PO.1 D10S1248 D10S1248.1 D12S391 D12S391.1 
1 203078  -9  -9  15   15  18  20 
2 203078  -9  -9  14   15  17  19 
6 203080  10  11  14   16  -9  -9 
7 203081  10  12  14   16  -9  -9 
8 203081  11  12  15   16  -9  -9 
9 203082  11  11  13   15  -9  -9 
10 203082  11  11  13   14  -9  -9 
相关问题