【问题标题】:Speeding up join by group in data.table R [duplicate]在data.table R中加速按组加入[重复]
【发布时间】:2015-02-03 03:34:28
【问题描述】:

我想填写每个 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)[]

给予

> dt
    id      value time
 1:  1 -0.9062227    1
 2:  1  2.0822289    2
 3:  1  0.5073055    3
 4:  2  0.3673813    3
 5:  2         NA    4
 6:  2  0.3726807    5
 7:  2 -0.7381199    6
 8:  2  0.7048979    7
 9:  3 -0.7852230    2
10:  3  0.2327946    3
11:  3         NA    4
12:  3         NA    5
13:  3 -0.3430340    6

现在这些年是连续的,并且为缺失值添加了 NA,这正是我想要的。

但是,这个解决方案永远需要一个更大的 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]
 )

这大约 100000 行大约需要 20 秒。

我想为具有 1 亿行的数据表执行此操作。一定有更快的方法?

【问题讨论】:

  • @eddi 你是完全正确的。感谢您指出我的答案。这是我的具体问题的代码:# Eddi's solution.setkey(dt, id, year)system.time(dt &lt;- dt[setkey(dt[, min(year):max(year), by=id], id, V1)])基本上他正在创建一个新的data.table,每个ID只有年份序列变量,然后加入原始data.table。它几乎立即运行。
  • 为便于阅读而编辑,模组请删除我上面的​​评论。 @eddi 你是完全正确的。感谢您指出我的答案。这是 eddi 针对我的具体问题的解决方案:setkey(dt, id, year) 然后dt &lt;- dt[setkey(dt[, min(year):max(year), by=id], id, V1)] 基本上他正在创建一个新的 data.table,其中每个 ID 仅包含完整的年份序列,然后加入原始 data.table。它几乎立即运行。

标签: r data.table


【解决方案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

数据

 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多