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

标签 r merge 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"))

这将产生两个数据集:
    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 循环来解决这个问题,因为数据太长,完成任务需要很长时间。我也试过 mergesqldf但他们都没有完成这项工作。你能帮我解决这个问题吗?非常感谢!

最佳答案

我会这样做:

setkey(d1, v1, V3) 
d1[d2, v4 := v4][]
  • 对于表单 x[i] 的连接, key 为 x需要设置。 i可能有也可能没有 key 集。所以我们设置了 d1 的 key 这里到专栏 v1V3 .
  • 接下来,我们执行连接 d1[d2]其中,对于 d2 的每一行查找与 d1 的键列匹配的行并返回连接结果。我们并不是在寻找那个结果。我们更愿意添加一个新列,其中每个匹配的行都从 d2 获取它的值。的 v4否则 NA .为此,我们利用 data.table 的 sub-assign by reference 功能。加盟时ix ,我们仍然可以在 j 中提供表达式,并引用 i的列。您也可以将它们称为 i.v4 (通常在 xi 中都有相同名称的列时使用)。
  • :=通过引用添加/更新列。 :=的LHS是我们要在此处创建的列名和 RHS v4是我们要为其分配的值(这里是来自 d2 的列)。因此,对于每个匹配的行,我们分配 d2v4d1的新列(我们命名)v4通过引用(就地,意味着没有复制),那些没有匹配的行将获得默认值 NA .
  • 最后 []只是将输出打印到屏幕上,如 :=无形地返回结果。

  • 希望这有助于理解这里发生了什么。

    关于r - 如何合并两个大数据集,同时在 r 中生成具有不同重复值的新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26719940/

    相关文章:

    r - 在R中的for循环内运行函数时中断for循环

    r - 合并具有相似信息的行

    python-3.x - 通过python中的多个条件合并不同数量的行和列

    r - data.table:使用 lapply 和 .SD 创建多列

    使用 rCharts 和 shiny 删除传单热图层

    r - 给定 R 中的特定概率值生成随机数(0 和 1)

    mysql - JPA EntityExistsException 合并时重复条目?

    git - 在git中 merge 从主分支到远程分支的更改

    r - 通过引用处理具有 := (data. 表分配的复杂公式)

    r - 条件 data.table 与 .EACHI 合并