如何在r中生成具有不同重复值的新列时合并两个大数据集

sxg*_*xgn 5 merge r data.table

我有一个问题让我发疯,真的需要你的帮助.简化的问题是这样的:

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"))
Run Code Online (Sandbox Code Playgroud)

这将产生两个数据集:

    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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,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
Run Code Online (Sandbox Code Playgroud)

我使用的实际数据的大小相对非常大.它类似于联合113MB数据和23MB.我试图使用for循环来解决这个问题,因为数据太长了,完成任务需要很长时间.我也试过merge,sqldf但他们都未能完成这项工作.你能帮帮我解决这个问题吗?非常感谢你!

Aru*_*run 7

我这样做:

setkey(d1, v1, V3) 
d1[d2, v4 := v4][]
Run Code Online (Sandbox Code Playgroud)
  • 对于表单的连接,需要设置x[i]密钥x.i可能有也可能没有密钥集.所以我们在d1这里设置关键列v1和关键字V3.

  • 接下来,我们执行一个连接d1[d2],对于每一行,d2找到与键列匹配的行,d1并返回连接结果.我们并没有准确地寻找那个结果.我们宁愿要添加一个新列,其中每个匹配的行得到它的价值d2v4和,否则NA.为此,我们通过引用功能使用data.table的子赋值.在加入ix,我们仍然可以提供表达式j,并参考i列.你也可以把它们称为i.v4(如果有两个名称相同的列通常使用xi).

  • :=通过引用添加/更新列.LHS :=是我们想要在这里创建的列名,RHS v4是我们想要从中分配的值(这里是它的列d2).因此,对于每个匹配行,我们通过引用(就地,意味着不进行复制)将d2's ' 分配v4d1新列(我们命名v4),并且那些没有匹配的行将获得默认值NA.

  • 最后一个[]是将输出打印到屏幕,因为:=无形地返回结果.

希望这有助于了解这里发生了什么.