R 使用其他data.table中的值更新data.table中的值
我有一个大约2500万行的数据集。我从这些行中选取一个子集,并执行一个运行良好的函数。然而,我接下来需要做的是用新值更新原始数据集中的值,同时保留其余的值。我相信这很简单,但我就是想不通 这是我正在处理的问题的简化版本:R 使用其他data.table中的值更新data.table中的值,r,data.table,R,Data.table,我有一个大约2500万行的数据集。我从这些行中选取一个子集,并执行一个运行良好的函数。然而,我接下来需要做的是用新值更新原始数据集中的值,同时保留其余的值。我相信这很简单,但我就是想不通 这是我正在处理的问题的简化版本: require("data.table") df <-data.frame(AREA_CD = c(sample(1:25000000, 25000000, replace=FALSE)), ALLOCATED = 0, ASSIGNED = "A", ID_CD =
require("data.table")
df <-data.frame(AREA_CD = c(sample(1:25000000, 25000000, replace=FALSE)), ALLOCATED = 0, ASSIGNED = "A", ID_CD = c(1:25000000))
df$ID_CD <- interaction( "ID", df$ID_CD, sep = "")
dt <- as.data.table(df)
sub_dt <- dt[5:2004,]
sub_dt[,ALLOCATED:=ALLOCATED+1]
sub_dt[,ASSIGNED:="B"]
require(“data.table”)
dfDavid Arenburg提供的答案解释了如何将修改后的数据子集连接回原始的数据表
但是,我想知道为什么OP不使用返回列表的函数通过引用直接在原始数据表中应用更改:
my_fun <- function(alloc, assig) {
list(
alloc + 1,
"B")
}
基准
由于内存限制,只使用了250万行的较小数据集(而不是OP中的2500万行)
库(微基准)
setDT(df)#强制df到data.table
微基准(
copy=dt请确保保持您的…最小值我认为类似于dt[sub_dt,`:=`(分配的=i.ASSIGNED,分配的=i.ASSIGNED),on=(ID_CD)]
应该可以。除此之外,我真的希望您创建数据集的方式不是您在实际代码中使用的实际语法。@Davidernburg,谢谢,效果很好。不,我在示例中使用的语法不是我实际使用的语法。谢谢您的回答。我没有想过这样做。您建议的路线工作ks。但是,我对您的解决方案的问题是,我在实际版本的dt中设置了键,一旦应用了您的函数,这些键就会丢失。很高兴,它可以工作。哪些字段设置了键?能否显示data.table::tables()的结果
在应用该功能之前和之后?也许,如果您可以发布一个新问题,并附上适当的答案(包括关键点),这会更好?我问了一个新问题()与此相关。你的回答让我觉得我一直在处理我试图解决的更大的问题。因此,我需要一些帮助,为我指明正确的方向!
dt[5:2004, c("ALLOCATED", "ASSIGNED") := my_fun(ALLOCATED, ASSIGNED)]
dt[1:7]
# AREA_CD ALLOCATED ASSIGNED ID_CD
#1: 1944 0 A ID1
#2: 3265 0 A ID2
#3: 15415 0 A ID3
#4: 14121 0 A ID4
#5: 10546 1 B ID5
#6: 2263 1 B ID6
#7: 12339 1 B ID7
library(microbenchmark)
setDT(df) # coerce df to data.table
microbenchmark(
copy = dt <- copy(df),
join = {
dt <- copy(df)
sub_dt <- dt[5:2004,]
sub_dt[,ALLOCATED:=ALLOCATED+1]
sub_dt[,ASSIGNED:="B"]
dt[sub_dt, `:=`(ALLOCATED = i.ALLOCATED, ASSIGNED = i.ASSIGNED), on = .(ID_CD)]
},
byref = {
dt <- copy(df)
dt[5:2004, c("ALLOCATED", "ASSIGNED") := my_fun(ALLOCATED, ASSIGNED)]
},
times = 10L
)
#Unit: milliseconds
# expr min lq mean median uq max neval
# copy 13.80400 14.07850 28.22882 14.15836 14.39643 154.70570 10
# join 239.36476 240.72745 244.27668 243.52967 246.17104 255.06271 10
# byref 14.28806 14.47308 15.00056 14.63147 14.73134 18.71181 10