【发布时间】:2020-04-09 23:37:24
【问题描述】:
对于具有来自多个来源的数据的子组,我需要在 ID 和时间点内替换数据框的所有列中的缺失值。如果不是太复杂,最好优先考虑来自源 B 的数据(例如,在下面数据中变量 Y 的 id 为 2 的情况下)。
使用下面的代码,它目前可以同时处理一列(没有优先级),但由于它是一个包含数百万行的大型数据框,因此需要进一步自动化。另外,如果可能,我想将其保留在 data.table 框架内。有什么建议吗?
# Data
id time X Y Source
1 2005 67 NA A
1 2005 NA 1.1 B
1 2005 NA 1.1 B
2 2003 85 NA B
2 2003 NA 0.4 A
2 2003 85 0.5 B
# Desired output
id time X Y Source
1 2005 67 1.1 A
1 2005 67 1.1 B
1 2005 67 1.1 B
2 2003 85 0.5 B
2 2003 85 0.4 A
2 2003 85 0.5 B
# Find duplicates
dup <- (duplicated(dat[,c('id','time')])|duplicated(dat[,c('id','time')], fromLast=TRUE))
# Replace NA in column X
library(data.table)
dat[dup & is.na(X), X := dat[!is.na(X)][.SD, on=.(id,time), mult="last", X]]
### Solution based on locf and an internal data.table loop (still slower than tidyverse)
library(data.table)
library(zoo)
cols <- colnames(dat)[c(-1,-2)]
dat <- dat[order(id,time,Source)] # this combined with na.locf0(fromLast=T) takes care of the priority.
dup <- (duplicated(dat[,c('id','time')])|duplicated(dat[,c('id','time')], fromLast=TRUE))
t1 <- Sys.time()
dat=rbind(
dat[!dup],
dat[dup, lapply(.SD, na.locf0,fromLast = TRUE), by=c('id','time'), .SDcols = cols][
,lapply(.SD, na.locf0), by=c('id','time'), .SDcols = cols]
)
t2 <- Sys.time()
t2-t1
【问题讨论】:
-
我有点困惑,你能显示所需的输出吗?
-
抱歉,现在添加。
标签: r performance loops data.table subset