如何使用 R 中基于面板数据的客户 ID 的所有列的中值插补填充缺失值?
Posted
技术标签:
【中文标题】如何使用 R 中基于面板数据的客户 ID 的所有列的中值插补填充缺失值?【英文标题】:How to fill missing values using median imputation in R for all the columns based on a customer id for panel data? 【发布时间】:2017-07-04 15:31:03 【问题描述】:Customer id Year a b
1 2000 10 2
1 2001 5 3
1 2002 NA 4
1 2003 NA 5
2 2000 2 NA
2 2001 NA 4
2 2002 4 NA
2 2003 8 10
3 2000 9 NA
3 2001 10 NA
3 2002 11 12
【问题讨论】:
zoo
对这种类型的东西有用...zoo::na.aggregate(d[c("a", "b")], d$Customerid, FUN=median)
【参考方案1】:
您可以执行以下操作:
require(dplyr)
impute_median <- function(x)
ind_na <- is.na(x)
x[ind_na] <- median(x[!ind_na])
as.numeric(x)
dat %>%
group_by(Customer_id) %>%
mutate_at(vars(a, b), impute_median)
【讨论】:
我喜欢这里的dplyr
和magrittr
的实现,但是当我运行它时,它似乎没有返回正确的中值。【参考方案2】:
data.table
解决方案:
dat[, `:=` (a= ifelse(is.na(a), median(a, na.rm=TRUE), a)
b= ifelse(is.na(a), median(b, na.rm=TRUE), b)), by= "Customer_id"]
这应该而且现在比@Floo0 的上述解决方案更快,因为他对每一列进行两次扫描。
library(data.table)
library(microbenchmark)
set.seed(1234L)
dat <- data.frame(id= rep(c(1:10), each= 100),
a= rnorm(1000),
b= rnorm(1000))
dat[,2:3] <- apply(dat[,2:3], 2, function(j)
idx <- sample.int(1000, 100, replace=F)
j[idx] <- NA
return(j)
)
require(dplyr)
impute_median <- function(x)
ind_na <- is.na(x)
x[ind_na] <- median(x[!ind_na])
as.numeric(x)
dat2 <- setDT(dat)
microbenchmark(Floo0= dat %>%
group_by(id) %>%
mutate_at(vars(a, b), impute_median),
alex= dat[, `:=` (a= ifelse(is.na(a), median(a, na.rm=TRUE), a),
b= ifelse(is.na(a), median(b, na.rm=TRUE), b)), by= "id"])
Unit: milliseconds
expr min lq mean median uq max neval cld
Floo0 3.703411 3.851565 4.216543 3.947955 4.167063 7.67234 100 b
alex 1.265559 1.430002 1.704431 1.486006 1.687710 5.21753 100 a
【讨论】:
以上是关于如何使用 R 中基于面板数据的客户 ID 的所有列的中值插补填充缺失值?的主要内容,如果未能解决你的问题,请参考以下文章
R语言vtreat包自动处理dataframe的缺失值计算数据列的均值和方差并基于均值和方差信息对数据列进行标准化缩放计算所有数据列的均值和方差对所有数据列进行标准化缩放