Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从一个data.frame中筛选出另一个data.frame中存在的行_R - Fatal编程技术网

从一个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

假设我有一个较大的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      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