用每组前一行中的值替换 NA
Replacing NAs with values in the previous row for each group
在 df
中,我想用每个 id
的先前非 NA 值替换 NA 值
id<-c(1,1,1,1,2,2,2)
purchase<-c(20,NA,NA,10,NA,NA,5)
df<-data.frame(id,purchase)
id purchase
1 20
1 NA
1 NA
1 10
2 NA
2 NA
2 5
理想情况下输出应如下所示:
id purchase
1 20
1 20
1 20
1 10
2 NA
2 NA
2 5
我知道 Replacing NAs with latest non-NA value,但不是按组进行。
任何帮助,将不胜感激。
三种方式(到目前为止),每组 都利用了 zoo::na.locf
。需要注意的一件事是您 需要 na.rm=FALSE
,否则 zoo::na.locf
可能 return 一个缩短的向量(如 id
是 2).
基础 R
do.call("rbind.data.frame",
by(df, df$id, function(x) transform(x, purchase = zoo::na.locf(purchase, na.rm=FALSE))))
# id purchase
# 1.1 1 20
# 1.2 1 20
# 1.3 1 20
# 1.4 1 10
# 2.5 2 NA
# 2.6 2 NA
# 2.7 2 5
dplyr
library(dplyr)
df %>%
group_by(id) %>%
mutate(purchase = zoo::na.locf(purchase, na.rm = FALSE))
data.table
library(data.table)
DT <- as.data.table(df)
DT[, purchase := zoo::na.locf(purchase, na.rm = FALSE), by = "id" ]
在 df
中,我想用每个 id
id<-c(1,1,1,1,2,2,2)
purchase<-c(20,NA,NA,10,NA,NA,5)
df<-data.frame(id,purchase)
id purchase
1 20
1 NA
1 NA
1 10
2 NA
2 NA
2 5
理想情况下输出应如下所示:
id purchase
1 20
1 20
1 20
1 10
2 NA
2 NA
2 5
我知道 Replacing NAs with latest non-NA value,但不是按组进行。 任何帮助,将不胜感激。
三种方式(到目前为止),每组 都利用了 zoo::na.locf
。需要注意的一件事是您 需要 na.rm=FALSE
,否则 zoo::na.locf
可能 return 一个缩短的向量(如 id
是 2).
基础 R
do.call("rbind.data.frame",
by(df, df$id, function(x) transform(x, purchase = zoo::na.locf(purchase, na.rm=FALSE))))
# id purchase
# 1.1 1 20
# 1.2 1 20
# 1.3 1 20
# 1.4 1 10
# 2.5 2 NA
# 2.6 2 NA
# 2.7 2 5
dplyr
library(dplyr)
df %>%
group_by(id) %>%
mutate(purchase = zoo::na.locf(purchase, na.rm = FALSE))
data.table
library(data.table)
DT <- as.data.table(df)
DT[, purchase := zoo::na.locf(purchase, na.rm = FALSE), by = "id" ]