25

Suppose I have a larger data.frame and a smaller one. If the smaller one is contained inside the larger one, how can I subtract the rows of the smaller data.frame, leaving a result with the difference:

Larger - Smaller

Example:

Small data.frame:

     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

Big data.frame:

      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

The small data.frame corresponds to the rows 3, 4 and 5 of the larger data.frame.

4

3 回答 3

19

尝试这个:

BigDF[ !(BigDF$ID %in% SmallDF$ID), ]
于 2013-05-01T23:23:47.430 回答
17

在 dplyr 中:

library(dplyr)

setdiff(BigDF, SmallDF)

更多信息:Hadley 的dply 备忘单https ://www.rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdf

带有示例 的简洁集合操作函数http://rpackages.ianhowson.com/cran/dplyr/man/setops.html(但整个数据操作语法是一个很好的资源)

尽管以下内容不能直接回答您的问题 - 它经常与我相关(并且非常有用)

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

setdiff(NewDF, OldDF)
于 2016-05-19T20:56:22.687 回答
1

没有时 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
于 2018-07-27T16:13:19.303 回答