【发布时间】:2014-08-01 15:34:40
【问题描述】:
所有,我希望你能帮助我解决这个问题。是的,我已经在这里和其他网站上查找了潜在的解决方案,但到目前为止还没有运气。
我有一个大数据表(总共 357 个变量),我需要将其中的三个变量与其存储在单独列表中的描述相匹配。我也将这些列表转换为 data.table,因为我认为这将有助于合并过程。
所以,例如在 dt 中:
Market Store Product var-1 ... var-n
2 1 1 XYZ GHY HHH ABC ZZZ
1 1 3 XYZ HJK III CDE FFF
2 3 1 GHY JUU JJJ JJJ KKK
2 1 1 HHH UUU JJJ JJJ HHH
当我将数据加载到 dt 中时,Market、Store 和 Product 被存储为 Factors,但我将它们转换为数字,因为我认为这也有助于合并。
在marketdesc、storedesc和productdesc中对应的表很简单,例如——在marketdesc中:
idx marketdesc
1 North/West
2 North
3 North/East
4 East
5 South/East
6 South
7 South/West
8 West
我想作为最终表创建的是一个 data.table,它可以独立地进行进一步分析,而无需从其他表中查找值,例如
Market Store Product var-1 ... var-n
North Chain X Apple XYX GHY HHH ABC ZZZ
North/West Chain X Banana XYZ HJK III CDE FFF
North Chain Z Apple GHY JUU JJJ JJJ KKK
North Chain X Apple HHH UUU JJJ JJJ HHH
由于 data.table 不喜欢 by.x 和 by.y,我将 idx 更改为与查找表中的变量名相同的变量名,并执行以下操作:
dt1 <- merge(dt,marketdesc,by="Market")
dt2 <- merge(dt1,storedesc,by="Store")
dt3 <- merge(dt2,productdesc,by="Product")
这不是最有效和最优雅的编码,我知道它也不是内存管理的最佳方法——但我的 R 技能仍然非常有限。有人知道解决问题的更好方法吗?
非常感谢任何建议!
编辑:
以下创建示例数据表(不包括暂时不需要的 var-1 ... var-n):
library(data.table)
dt <- data.table(Market=c('2','1','2','2'),Store=c('1','1','3','1'),Product=c('1','2','1','1'))
marketdesc <- data.table(Market=1:8,desc=c('North/West','North','North/East','East','South/East','South','South/West','West'))
storedesc <- data.table(Store=1:3,desc=c('Chain X','Chain Y','Chain Z'))
productdesc <- data.table(Product=1:5,desc=c('Apple','Orange','Banana','Strawberry','Pineapple'))
执行合并构造需要我删除原始列,然后在每一步之后用旧变量名重命名“desc”。
任何指针表示赞赏。
【问题讨论】:
-
请提供一个可重现的例子。
-
斯文 - 谢谢你的建议。我已经提供了代码 sn-p 来生成示例数据。
-
听起来你正在做的工作很好。您的目标是简单地减少所需的代码量吗?我认为
data.table不必重命名和删除列本身就效率低下。
标签: r merge data.table