从一个data.frame中筛选出另一个data.frame中存在的行
假设我有一个较大的data.frame和一个较小的data.frame。如果较小的数据包含在较大的数据中,我如何减去较小的data.frame的行,从而留下一个有差异的结果: 大-小 例如: 小数据帧:从一个data.frame中筛选出另一个data.frame中存在的行,r,R,假设我有一个较大的data.frame和一个较小的data.frame。如果较小的数据包含在较大的数据中,我如何减去较小的data.frame的行,从而留下一个有差异的结果: 大-小 例如: 小数据帧: ID CSF1PO CSF1PO.1 D10S1248 D10S1248.1 D12S391 D12S391.1 203079_BA_M 10 11 14 16 -9 -9 203079_BA_F
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
大数据框架:
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
较小的data.frame对应于较大的data.frame的第3、4和5行。尝试以下操作:
BigDF[ !(BigDF$ID %in% SmallDF$ID), ]
在dplyr中:
library(dplyr)
setdiff(BigDF, SmallDF)
更多信息:哈德利的dply备忘:
简洁的集合操作功能和示例(但整体而言,这是一个很好的资源)
虽然下面的内容并不是对你问题的直接回答,但它经常与我相关(而且非常有用)
如果您希望捕获在新数据帧和相同数据帧的早期版本(在相同记录中)之间发生的新更改,您需要使代码如下所示:
setdiff(NewDF, OldDF)
当列数和类型数匹配时,setdiff是好的,但当小数据帧有来自大数据帧的列子集时,则会出现问题 另一种选择是dplyr中的反连接,它提供大数据帧中不在小数据帧中的所有行。它将列保留在您需要的大数据框中,而不是像其他联接那样与小数据框列组合。参见链接 您应该将ID(如果是列名)更改为character,否则默认情况下R将强制为character,并向您发出警告,但已给出正确的结果。我使用以下方法得到了与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
是一个键(唯一地确定行的其余部分),Big[!(Big$ID%在%Small$ID中),]
应该可以工作。我想没有钥匙会更混乱。ID实际上是行名。。。数据帧中没有列,但如果需要,我可以将其设置为列。无需。只需使用rownames(Big)
代替Big$ID
。