我有一个让我发疯的问题,真的需要你的帮助。
简化的问题是这样的:
d1<-data.table(v1=c("a","b","c","d","d","b","a","c","a","d","b","a"),
v2=(seq(1:12)),V3=rep(1:4,times=3))
d2<-data.table(v1=c("a","b","c","d"),v3=c(3,2,1,4),v4=c("y","x","t","e"))
这将产生两个数据集:
D1:
v1 v2 V3
1: a 1 1
2: b 2 2
3: c 3 3
4: d 4 4
5: d 5 1
6: b 6 2
7: a 7 3
8: c 8 4
9: a 9 1
10: d 10 2
11: b 11 3
12: a 12 4
> d2
v1 v3 v4
1: a 3 y
2: b 2 x
3: c 1 t
4: d 4 e
如您所见,v1 和 v3 中的元素是相同的。现在我想通过在 D1 中创建一个新列来连接两个数据集,该列返回 d2 中与索引 v1 和 v3 匹配的 V4 的值,我希望我可以得到如下所示的输出:
>
d3
v1 v2 V3 V4
1: a 1 1 na
2: b 2 2 x
3: c 3 3 na
4: d 4 4 e
5: d 5 1 na
6: b 6 2 x
7: a 7 3 y
8: c 8 4 na
9: a 9 1 na
10: d 10 2 na
11: b 11 3 na
12: a 12 4 na
我使用的实际数据的大小相对非常大。它类似于 113MB 数据与 23MB 的联合数据。我尝试使用 for 循环来解决这个问题,因为数据太长,完成任务需要很长时间。我也试过
merge
和 sqldf
但他们都没有完成这项工作。你能帮我解决这个问题吗?非常感谢!
最佳答案
我会这样做:
setkey(d1, v1, V3)
d1[d2, v4 := v4][]
x[i]
的连接, key 为 x
需要设置。 i
可能有也可能没有 key 集。所以我们设置了 d1
的 key 这里到专栏 v1
和 V3
. d1[d2]
其中,对于 d2
的每一行查找与 d1
的键列匹配的行并返回连接结果。我们并不是在寻找那个结果。我们更愿意添加一个新列,其中每个匹配的行都从 d2
获取它的值。的 v4
否则 NA
.为此,我们利用 data.table 的 sub-assign by reference 功能。加盟时i
至 x
,我们仍然可以在 j
中提供表达式,并引用 i
的列。您也可以将它们称为 i.v4
(通常在 x
和 i
中都有相同名称的列时使用)。 :=
通过引用添加/更新列。 :=
的LHS是我们要在此处创建的列名和 RHS v4
是我们要为其分配的值(这里是来自 d2
的列)。因此,对于每个匹配的行,我们分配 d2
的 v4
到 d1
的新列(我们命名)v4
通过引用(就地,意味着没有复制),那些没有匹配的行将获得默认值 NA
. []
只是将输出打印到屏幕上,如 :=
无形地返回结果。 希望这有助于理解这里发生了什么。
关于r - 如何合并两个大数据集,同时在 r 中生成具有不同重复值的新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26719940/