加速data.R表中的按组联接
我想填写每个ID缺失的年份。这对于下面的小示例来说很容易加速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
# 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)