Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使用其他data.table中的值更新data.table中的值_R_Data.table - Fatal编程技术网

R 使用其他data.table中的值更新data.table中的值

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 =

我有一个大约2500万行的数据集。我从这些行中选取一个子集,并执行一个运行良好的函数。然而,我接下来需要做的是用新值更新原始数据集中的值,同时保留其余的值。我相信这很简单,但我就是想不通

这是我正在处理的问题的简化版本:

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