我有一个data.table,我想完成一列以填充一些缺少的值,但是在填充其他列时遇到一些麻烦。
dt = data.table(a = c(1, 3, 5), b = c('a', 'b', 'c'))
dt[, .(a = seq(min(a), max(a), 1), b = na.locf(b))]
# a b
# 1: 1 a
# 2: 2 b
# 3: 3 c
# 4: 4 a
# 5: 5 b
但是正在寻找更像这样的东西:
dt %>%
complete(a = seq(min(a), max(a), 1)) %>%
mutate(b = na.locf(b))
# # A tibble: 5 x 2
# a b
# <dbl> <chr>
# 1 1 a
# 2 2 a
# 3 3 b
# 4 4 b
# 5 5 c
最后一个值的结转位置
data.table
默认情况下会在您尝试dt[, .(a = seq(min(a), max(a), 1))]
时回收观测,因此它永远不会为填充NA
生成任何na.locf
值。非常确定您需要在此处使用联接来“完成”案例,然后可以使用na.locf
进行填写。
t1 <- data.table(a = seq(min(dt$a), max(dt$a), 1))
dt[t1, on = 'a'][, .(a, b = na.locf(b))]
不确定是否可以跳过单独的t1
行,但这会为您提供所需的结果。
a b
1: 1 a
2: 2 a
3: 3 b
4: 4 b
5: 5 c
仅具有data.table的另一种可能的解决方案:
dt[dt[, .(a = Reduce(":", a))], on = .(a), roll = Inf]
给出:
a b 1: 1 a 2: 2 a 3: 3 b 4: 4 b 5: 5 c
这可以简单地(鸣谢@ Mako212):
dt[dt[, .(a = min(a):max(a))], on = .(a), roll = Inf]