我在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
我希望得到一个尽可能少的答案,但是在计算最终总和之前可能还需要进一步的子集化。
期待您的回答,谢谢!
答案 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
格式。除此之外,这允许您为每个人拥有不同数量的别名,而不需要拥有与员工一样多的列,而大多数别名具有别名。