按组完成时,data.table中的nalocf

问题描述 投票:0回答:2

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

最后一个值的结转位置

r data.table
2个回答
0
投票

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

0
投票

仅具有的另一种可能的解决方案:

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]
© www.soinside.com 2019 - 2024. All rights reserved.