加速data.R表中的按组联接

加速data.R表中的按组联接,r,data.table,R,Data.table,我想填写每个ID缺失的年份。这对于下面的小示例来说很容易 # Create example data table. dt <- data.table(id = c(1, 1, 1, 2, 2, 2, 2, 3, 3, 3), value = rnorm(10), time = c(1, 2, 3, 3, 5, 6, 7, 2, 3, 6)) # Sort by time variable. setkey(dt, time

我想填写每个ID缺失的年份。这对于下面的小示例来说很容易

# Create example data table.
dt <- data.table(id = c(1, 1, 1, 2, 2, 2, 2, 3, 3, 3),
                 value = rnorm(10),
                 time = c(1, 2, 3, 3, 5, 6, 7, 2, 3, 6))

# Sort by time variable.
setkey(dt, time)

# Fill in the gaps.
system.time(
dt <- dt[, .SD[J(min(time):max(time))], by=id]
)

# Sort by ID and time, then print.
setkey(dt, id, time)[]
这些年现在是连续的,NAs已经被添加为缺少的值,这正是我想要的

但是,此解决方案需要在一个更大的data.table上使用更长的时间

 # Create big example data table
 n <- 1e5
 dt <- data.table(id = rep(1:(n/4), each=4),
             value = rnorm(n),
             year = sample(1997:2001, n, replace=TRUE))

 # Remove duplicate years.
 setkey(dt, id, year)
 dt <- unique(dt)

 # Fill in the gaps.
 setkey(dt, year)
 system.time(
 dt2 <- dt[, .SD[J(min(year):max(year))], by=id]
 )
大约需要20秒的时间才能完成这100000行

我想对一个有1亿行的数据表这样做。一定有更快捷的方法吗?

这会有帮助吗

 dtN <- copy(dt)
 setkey(dtN, id, year)
 system.time({
  dtN2 <- dtN[, list(year=min(year):max(year)), by=id]
  setkey(dtN2, id, year)
  res <- dtN[dtN2]
})
# user  system elapsed 
# 0.047   0.000   0.048 
 dim(res)
 #[1] 122958      3

 setkey(dt, year)
  system.time(
  dt2 <- dt[, .SD[J(min(year):max(year))], by=id]
  )
  #user  system elapsed 
  # 20.078   0.035  20.109 

  dim(dt2)
 #[1] 122958      3
数据 这有帮助吗

 dtN <- copy(dt)
 setkey(dtN, id, year)
 system.time({
  dtN2 <- dtN[, list(year=min(year):max(year)), by=id]
  setkey(dtN2, id, year)
  res <- dtN[dtN2]
})
# user  system elapsed 
# 0.047   0.000   0.048 
 dim(res)
 #[1] 122958      3

 setkey(dt, year)
  system.time(
  dt2 <- dt[, .SD[J(min(year):max(year))], by=id]
  )
  #user  system elapsed 
  # 20.078   0.035  20.109 

  dim(dt2)
 #[1] 122958      3
数据
@埃迪,你完全正确。谢谢你告诉我你的答案。以下是我的具体问题代码:Eddi的解决方案。setkeydt,id,year system.time dt为可读性而编辑,mods请删除我上面的评论@埃迪,你完全正确。谢谢你告诉我你的答案。这是埃迪针对我的具体问题的解决方案:setkeydt,id,year-then-dt@eddi你完全正确。谢谢你告诉我你的答案。以下是我的具体问题代码:Eddi的解决方案。setkeydt,id,year system.time dt为可读性而编辑,mods请删除我上面的评论@埃迪,你完全正确。谢谢你告诉我你的答案。这是eddi针对我的具体问题的解决方案:setkeydt,id,然后是年份dt
 n <- 1e5
 set.seed(24)
 dt <- data.table(id = rep(1:(n/4), each=4),
         value = rnorm(n),
         year = sample(1997:2001, n, replace=TRUE))

 dt <- unique(dt)