【问题标题】:na.locf in data.table when completing by group按组完成时 data.table 中的 na.locf
【发布时间】:2026-02-12 21:45:01
【问题描述】:

我有一个 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 

最后一个值结转的地方

【问题讨论】:

  • na.locf 来自哪里? zoo?

标签: r data.table


【解决方案1】:

仅具有 的(滚动)连接功能的另一种可能解决方案:

dt[.(min(a):max(a)), on = .(a), roll = Inf]

给出:

   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]

【讨论】:

  • 感谢关于滚动连接的提醒,很好的解决方案!
【解决方案2】:

data.table 在您尝试dt[, .(a = seq(min(a), max(a), 1))] 时默认回收观察结果,因此它永远不会为na.locf 生成任何NA 值来填充。很确定你需要在这里使用一个连接来“完成”这些案例,然后你可以使用na.locf 来填充。

dt[dt[, .(a = min(a):max(a))], 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

我将借用@Jaap 的min/max 行以避免创建第二个表。所以基本上你可以使用他的滚动加入解决方案,或者如果你想使用na.locf,这会得到相同的结果。

【讨论】: