R data.table保留组的第一个非NA值,直到组结束

R data.table保留组的第一个非NA值,直到组结束,r,data.table,R,Data.table,我想保留每组的第一个非NA值,称为基线,到相应组的末尾,如下所示 我掌握的数据如下: data <- data.table(id=rep(c(1,2,3),each=4), value=c(12, 10, 17, 19, 21, 22, 34, 18, NA, 12, 32, 18)) id value 1: 1 12 2: 1 10 3: 1 17 4: 1 19 5: 2 21 6: 2 22 7: 2

我想保留每组的第一个非NA值,称为基线,到相应组的末尾,如下所示

我掌握的数据如下:

data <- data.table(id=rep(c(1,2,3),each=4), value=c(12, 10, 17, 19, 21, 22, 34, 18, NA, 12, 32, 18))



   id value
 1:  1    12
 2:  1    10
 3:  1    17
 4:  1    19
 5:  2    21
 6:  2    22
 7:  2    34
 8:  2    18
 9:  3    NA
10:  3    12
11:  3    32
12:  3    18

请注意id=3,其第一个值为NA,不应保留。

我们可以从每个
id
中首先获得
非NA
,然后将
NA
s值替换回
NA

library(data.table)
data[, BASE := first(na.omit(value)), by = id][is.na(value), BASE:=NA]

data
#    id value BASE
# 1:  1    12   12
# 2:  1    10   12
# 3:  1    17   12
# 4:  1    19   12
# 5:  2    21   21
# 6:  2    22   21
# 7:  2    34   21
# 8:  2    18   21
# 9:  3    NA   NA
#10:  3    12   12
#11:  3    32   12
#12:  3    18   12
或者使用与
dplyr相同的逻辑

library(dplyr)
data %>%
  group_by(id) %>%
  mutate(BASE = first(na.omit(value)), 
         BASE = replace(BASE, is.na(value), NA)) 

使用
.SD
过滤NA值和assing:

data[!is.na(value), BASE := .SD[1L], by = id, .SDcols = "value"]
这应该行得通

data[, BASE := na.omit(value)[1], by = id]
或者也
数据[!is.na(值),BASE:=值[1L],id]
data[, BASE := na.omit(value)[1], by = id]