从另一个中减去一个数据帧

时间:2013-05-01 23:19:53

标签: r

假设我有一个更大的数据框和一个更小的数据框。如果较小的那个包含在较大的那个中,我该怎么办:

  

更大 - 更小

示例:

小数据框:

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

大数据框架:

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

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

3 个答案:

答案 0 :(得分:19)

试试这个:

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

答案 1 :(得分:10)

在dplyr:

library(dplyr)

setdiff(BigDF, SmallDF)
  

更多信息:哈德利的 dply cheatsheet https://www.rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdf

     

使用示例http://rpackages.ianhowson.com/cran/dplyr/man/setops.html简明设置操作功能(但整个 Grammar of Data Manipulation 总体来说是一个很好的资源)

虽然下面没有直接回答你的问题 - 但这经常与我有关(并且非常有用)

如果您希望捕获新数据框与同一数据框的先前版本(在相同记录中)之间发生的新更改,您将希望使代码看起来如下所示:

setdiff(NewDF, OldDF)

答案 2 :(得分:0)

如果没有,

setdiff可以。列和类型的匹配,但是当小型数据框具有来自大型数据框的列的子集时会出现问题。

  

替代方法在dplyr中是反联接的,它为您提供了大数据框中所有不在小数据框中的行。它将列保留在所需的大数据框中,而不是像其他联接那样将其与小数据框组合。见链接http://rpubs.com/williamsurles/293454

您应该将ID(如果是列名)更改为字符,否则R将默认转换为字符并警告您,但给出正确的结果。使用以下命令,我得到了与setdiff()相同的答案:

small_df$ID <- as.character(small_df$ID)
big_df$ID   <- as.character(big_df$ID)
result      <- anti_join(big_df,small_df)

结果=

ID         CSF1P0 CSF1P0.1 D10S1248 D10S1248.1 D12S391 D12S391.1
203078_MG_M    -9   -9      15       15         18       20 
203078_MG_F    -9   -9      14       15         17       19
203080_BA_F    10   11      14       16         -9       -9  
203081_MG_M    10   12      14       16         -9       -9  
203081_MG_F    11   12      15       16         -9       -9 
203082_MG_M    11   11      13       15         -9       -9  
203082_MG_F    11   11      13       14         -9       -9