R data.table保留组的第一个非NA值,直到组结束
我想保留每组的第一个非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
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]