R 基于另一个数据集获取数据集的子集

R 基于另一个数据集获取数据集的子集,r,dataset,R,Dataset,假设我有一个数据集,即dat1 ID block plot SPID TotHeight 1 1 1 4 44.5 2 1 1 4 51 3 1 1 4 28.7 4 1 1 4 24.5 5 1 1 4 27.3 6 1 1 4 20 17 1 10 1 44.5 19 1 10 1 51 1 1 11 21 28.7 2 1 11 2

假设我有一个数据集,即dat1

ID  block   plot    SPID    TotHeight
1   1   1   4   44.5
2   1   1   4   51
3   1   1   4   28.7
4   1   1   4   24.5
5   1   1   4   27.3
6   1   1   4   20
17  1   10  1   44.5
19  1   10  1   51
1   1   11  21  28.7
2   1   11  21  24.5
3   1   11  21  27.3
4   1   11  21  20
5   1   11  21  12.88666667
6   1   11  21  7.235238095
7   1   11  21  1.583809524
然后我有另一个大数据集,即dat2:

ID  block   plot    SPID    Species TotHeight
1   1   1   4   BENI    72
2   1   1   4   BENI    55
3   1   1   4   BENI    51
4   1   1   4   BENI    47
5   1   1   4   BENI    49
6   1   1   4   BENI    34
7   1   1   4   BENI    .
8   1   1   4   BENI    51
9   1   1   4   BENI    66
10  1   1   4   BENI    40
11  1   1   4   BENI    24
12  1   1   4   BENI    62
13  1   1   4   BENI    34
14  1   1   4   BENI    49
15  1   1   4   BENI    57
16  1   1   4   BENI    22
17  1   1   4   BENI    76
18  1   1   4   BENI    56
19  1   1   4   BENI    55
20  1   1   4   BENI    29
21  1   1   4   BENI    24
22  1   1   4   BENI    18
23  1   1   4   BENI    65
24  1   1   4   BENI    55
25  1   1   4   BENI    63
26  1   1   4   BENI    57
27  1   1   4   BENI    57
28  1   1   4   BENI    57
29  1   1   4   BENI    45
30  1   1   4   BENI    83
31  1   1   4   BENI    37
32  1   1   4   BENI    56
33  1   1   4   BENI    65
34  1   1   4   BENI    75
35  1   1   4   BENI    51
36  1   1   4   BENI    .
1   1   2   16  PRSE    141
2   1   2   16  PRSE    192
3   1   2   16  PRSE    .
4   1   2   16  PRSE    197
5   1   2   16  PRSE    172
6   1   2   16  PRSE    143
7   1   2   16  PRSE    141
8   1   2   16  PRSE    155
9   1   2   16  PRSE    167
10  1   2   16  PRSE    155
11  1   2   16  PRSE    175
12  1   2   16  PRSE    190
13  1   2   16  PRSE    148
14  1   2   16  PRSE    180
15  1   2   16  PRSE    .

我的问题是如何从dat2中获取ID、块和绘图与dat1中匹配的数据子集?如何从dat2中获取ID、block和plot与dat1中不匹配的数据子集?

听起来您需要对ID、block和plot列进行
合并

假设您的数据是在名为
dat1
dat2
中读取的,这应该是您想要的:

> merge(dat1, dat2, by = c("ID", "block", "plot"))
  ID block plot SPID.x TotHeight.x SPID.y Species TotHeight.y
1  1     1    1      4        44.5      4    BENI          72
2  2     1    1      4        51.0      4    BENI          55
3  3     1    1      4        28.7      4    BENI          51
4  4     1    1      4        24.5      4    BENI          47
5  5     1    1      4        27.3      4    BENI          49
6  6     1    1      4        20.0      4    BENI          34
这实质上是对感兴趣的三列执行SQL术语的内部联接。如果您也感兴趣,请阅读“帮助”页面,了解左侧、右侧和外部连接的可能性

完全可复制的要点

为了从
dat2
中获取未合并的行,此黑客程序有效。也许有一种更有效的方法可以做到这一点,但它就在这里。首先,添加参数
all.y=TRUE
。这指定了一个右连接,它将返回未合并的
dat2
中的行。然后,我们可以在知道未合并的行将返回
NA

subset(merge(dat1, dat2, by = c("ID", "block", "plot"), all.y = TRUE), is.na(SPID.x) == TRUE)

非常感谢,蔡斯。如何通过删除已合并的数据集从dat2获取新数据集?Thanks@Dan-不确定我会百分之百地跟踪你。
merge
函数的结果是否符合您的要求?如果是这样,为什么不把它保存到一个新变量中,
dat3
?或者覆盖
dat2
,如果您知道不再需要它。Chase,Merge函数就是我想要的。我还想得到一个新的数据集,其中ID、block和plot与dat1中的不匹配。@Dan-添加到回答中以解决此问题。非常感谢。这真的帮了我大忙。