如何配对然后加入|合并两个data.tables?

时间:2014-04-22 21:44:29

标签: r join merge data.table

我在data.tables的世界里潜水,到目前为止享受语法,因为我发现我可以做更多的写作。然而,有时候有点异国情调。

这是我需要弄清楚的一件事 - 我知道如何进行连接,例如x [y],但我需要做的是更复杂(但仍然非常简单!)。

我们的销售数据库遭受了同一个Rep名称的多次迭代,我保留了一个单独的列表,告诉我两个名称实际上是同一个rep。对于$$,它可能有一个或两个版本的特定代表名称(通常是第一个,但有时某人的名字可能在一年的前几个月拼写错误,然后更正)。

我将提供两个我希望合并的示例data.table,我不知道如何得到我想要的结果,但我也会写出我想要发生的事情。

DT1 <- data.table(name=c("Bob Smith", "Robert Smith", "Mary Stone", "Maryanne Stone", "Jason Hasberg"),
                  sales=c(12, 15, 23, 10, 11))
DT2 <- data.table(correctname=c("Bob Smith", "Maryanne Stone", "Jason Hasberg"),
                  namechoice1=c("Robert Smith", "Mary Stone", "Jason Hasberg"),
                  namechoice2=c("Bob Smith", "Maryanne Stone", NA))

DT1

             name sales
1:      Bob Smith    12
2:   Robert Smith    15
3:     Mary Stone    23
4: Maryanne Stone    10
5:  Jason Hasberg    11

DT2

      correctname   namechoice1    namechoice2
1:      Bob Smith  Robert Smith      Bob Smith
2: Maryanne Stone    Mary Stone Maryanne Stone
3:  Jason Hasberg Jason Hasberg             NA

所以在ENGLISH中:如果DT1中的名称是namechoice1或namechoice2,那么在该行项目上使用correctname,然后将该名称下各种名称的销售额相加。

(注意,我为Jason扔了一个NA,因为这个名字不需要更正)

预期结果:

      correctname   sales
1:      Bob Smith      27
2: Maryanne Stone      33
3:  Jason Hasberg      11

我希望得到一个尽可能少的答案,但是在计算最终总和之前可能还需要进一步的子集化。

期待您的回答,谢谢!

1 个答案:

答案 0 :(得分:1)

您需要将名称映射表格式化为长格式,以便每个别名都有一行,每行也包含正确的名称。然后你可以加入别名并聚合真名:

DT2.new <- melt(DT2, id.vars="correctname")[!is.na(value), list(correctname, value)]
setkey(DT2.new, value)
DT2.new[DT1][, sum(sales), by=correctname]

产地:

      correctname V1
1:      Bob Smith 27
2: Maryanne Stone 33
3:  Jason Hasberg 11

请注意,存储别名的正确方法是DT2.new格式。除此之外,这允许您为每个人拥有不同数量的别名,而不需要拥有与员工一样多的列,而大多数别名具有别名。