假设我有一个更大的数据框和一个更小的数据框。如果较小的那个包含在较大的那个中,我该怎么办:
更大 - 更小
示例:
小数据框:
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行。
答案 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