【发布时间】: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 <- dt[setkey(dt[, min(year):max(year), by=id], id, V1)])基本上他正在创建一个新的data.table,每个ID只有年份序列变量,然后加入原始data.table。它几乎立即运行。 -
为便于阅读而编辑,模组请删除我上面的评论。 @eddi 你是完全正确的。感谢您指出我的答案。这是 eddi 针对我的具体问题的解决方案:
setkey(dt, id, year)然后dt <- dt[setkey(dt[, min(year):max(year), by=id], id, V1)]基本上他正在创建一个新的 data.table,其中每个 ID 仅包含完整的年份序列,然后加入原始 data.table。它几乎立即运行。
标签: r data.table