我有一个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
Run Code Online (Sandbox Code Playgroud)
但是正在寻找更像这样的东西:
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
Run Code Online (Sandbox Code Playgroud)
最后一个值结转到哪里
仅具有data.table的(滚动)联接功能的另一种可能的解决方案:
dt[.(min(a):max(a)), on = .(a), roll = Inf]
Run Code Online (Sandbox Code Playgroud)
这使:
Run Code Online (Sandbox Code Playgroud)a b 1: 1 a 2: 2 a 3: 3 b 4: 4 b 5: 5 c
在大型数据集上,这可能会胜过其他所有解决方案。
感谢@ Mako212,seq他在回答中给出了提示。
首次发布的解决方案有效,但给出警告:
dt[dt[, .(a = Reduce(":", a))], on = .(a), roll = Inf]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
48 次 |
| 最近记录: |