R 根据另一个data.table中的值更新data.table
我正在尝试根据另一个表中的值更新data.table。我原以为我有一个方法(尽管考虑到我实际的dt2有350万条记录,效率不是特别高),但结果证明我的代码出了问题 在DT1中,我有许多变量(数字),我想根据它们的分类值设置为1或0 数据示例:R 根据另一个data.table中的值更新data.table,r,join,data.table,R,Join,Data.table,我正在尝试根据另一个表中的值更新data.table。我原以为我有一个方法(尽管考虑到我实际的dt2有350万条记录,效率不是特别高),但结果证明我的代码出了问题 在DT1中,我有许多变量(数字),我想根据它们的分类值设置为1或0 数据示例: dt1 <- data.table(urn = 1:10, V1=0,V2=0,V3=0) ## urn V1 V2 V3 ## 1: 1 0 0 0 ## 2: 2 0 0 0 ## 3: 3 0 0 0 ##
dt1 <- data.table(urn = 1:10, V1=0,V2=0,V3=0)
## urn V1 V2 V3
## 1: 1 0 0 0
## 2: 2 0 0 0
## 3: 3 0 0 0
## 4: 4 0 0 0
## 5: 5 0 0 0
## 6: 6 0 0 0
## 7: 7 0 0 0
## 8: 8 0 0 0
## 9: 9 0 0 0
##10: 10 0 0 0
dt2 <- data.table(urn=rep(1:10,2),classification=0)
dt2$classification <- 1:7 #does give a warning message
## urn classification
## 1: 1 1
## 2: 2 2
## 3: 3 3
## 4: 4 4
## 5: 5 5
## 6: 6 6
## 7: 7 7
## 8: 8 1
## 9: 9 2
##10: 10 3
##11: 1 4
##12: 2 5
##13: 3 6
##14: 4 7
##15: 5 1
##16: 6 2
##17: 7 3
##18: 8 4
##19: 9 5
##20: 10 6
我实际期望的输出是:
## urn V1 V2 V3
## 1: 1 1 0 0
## 2: 2 0 1 0
## 3: 3 0 0 1
## 4: 4 0 0 0
## 5: 5 1 0 0
## 6: 6 0 1 1
## 7: 7 0 0 0
## 8: 8 1 0 0
## 9: 9 0 1 0
##10: 10 0 0 1
任何帮助都将不胜感激。特别是如果我能够简化命令,在一次扫描中管理所有这些数据,而不是3次数据连接。正如我所说的,3.5M记录增加了一点开销(特别是当我实际为大约10列设置标志时)
提前谢谢 您可以为此使用
dcast.data.table
dcast.data.table(data = dt1[dt2,],
formula = urn ~ classification,
fun.aggregate = function(x) as.numeric(any(!is.na(x))),
value.var = 'classification')[, list(urn, V1=`1`, V2=`2`, V3=`6`)]
## urn V1 V2 V3
## 1: 1 1 0 0
## 2: 2 0 1 0
## 3: 3 0 0 1
## 4: 4 0 0 0
## 5: 5 1 0 0
## 6: 6 0 1 1
## 7: 7 0 0 0
## 8: 8 1 0 0
## 9: 9 0 1 0
## 10: 10 0 0 1
编辑:如有必要,您可以在tryCatch
函数中包装最后一条语句:
dcast.data.table(data = dt1[dt2,],
formula = urn ~ classification,
fun.aggregate = function(x) as.numeric(any(!is.na(x))),
value.var = 'classification')[, list(urn,
V1=tryCatch(`1`, error = ## function(e) NA),
V2=tryCatch(`2`, error = function(e) NA),
V3=tryCatch(`8`, error = function(e) NA))]
## urn V1 V2 V3
## 1: 1 1 0 NA
## 2: 2 0 1 NA
## 3: 3 0 0 NA
## 4: 4 0 0 NA
## 5: 5 1 0 NA
## 6: 6 0 1 NA
## 7: 7 0 0 NA
## 8: 8 1 0 NA
## 9: 9 0 1 NA
## 10: 10 0 0 NA
类似于
dcast(dt1[dt2,],urn~classification)
的东西可能会起作用这看起来非常有希望,但我似乎无法让它与我的真实数据一起工作。在我的真实数据中,dt1和dt2中还有许多其他列。这可能会对上面的工作方式产生负面影响吗?考虑到上面所有的东西似乎都被命名了,我不会这么怀疑。。。非常感谢迄今为止的帮助。[我将在接下来的几个小时内参加会议,因此可能需要一段时间才能做出回应]如果这不起作用,你能举一个可复制的例子吗?或者至少打印您收到的错误消息?否则很难诊断问题。谢谢@shadow,我意识到了我的错误。在没有更新dt1的情况下运行代码之后,我再次检查了dt1的内容。我已经想出了解决这个问题的办法。谢谢,不过我的问题还有另一个扩展,如果我想用8代替V3的值6,我会得到一个错误,因为dt2没有任何分类为8的记录。我希望这是一段相当通用的代码,能够解释一系列分类的存在,但如果没有这些分类,就不会崩溃。有什么建议吗?
dcast.data.table(data = dt1[dt2,],
formula = urn ~ classification,
fun.aggregate = function(x) as.numeric(any(!is.na(x))),
value.var = 'classification')[, list(urn,
V1=tryCatch(`1`, error = ## function(e) NA),
V2=tryCatch(`2`, error = function(e) NA),
V3=tryCatch(`8`, error = function(e) NA))]
## urn V1 V2 V3
## 1: 1 1 0 NA
## 2: 2 0 1 NA
## 3: 3 0 0 NA
## 4: 4 0 0 NA
## 5: 5 1 0 NA
## 6: 6 0 1 NA
## 7: 7 0 0 NA
## 8: 8 1 0 NA
## 9: 9 0 1 NA
## 10: 10 0 0 NA