[英]Conditional mean for multiple columns in R?
我的數據是這樣的:
train <- data.frame(y=c(1,2,1,1), x1=c(2,4,NA,5), x2=c(8,NA,6,12))
我需要用該列的平均值替換每個 x 變量的缺失值 (NA),但必須使用該 x 變量的值來計算平均值,該 x 變量的相應 y 值等於該缺失行的 y 值價值。
例如:在 x1 列的 NA 所在的行中,y 值等於 1,因此該缺失值應替換為 2 到 5 之間的平均值(即 y 也是 1 的 x1 值) .
我的代碼是這樣的,但平均值不是有條件的:
for(i in 1:ncol(train)){
train[is.na(train[,i]), i] <- mean(train[,i], na.rm = TRUE)
}
library(dplyr)
train %>%
group_by(y) %>%
mutate_at(vars(-y), function(v){
if_else(is.na(v), mean(v, na.rm = TRUE), v)
}) %>%
ungroup()
## A tibble: 4 x 3
# y x1 x2
# <dbl> <dbl> <dbl>
#1 1 2 8
#2 2 4 NaN
#3 1 3.5 6
#4 1 5 12
我們可以在按 'y' 列分組后使用na.aggregate
library(dplyr)
library(zoo)
train %>%
group_by(y) %>%
mutate_at(vars(-one_of(group_vars(.))),
~if(all(is.na(.))) NA_real_ else na.aggregate(.))
# A tibble: 4 x 3
# Groups: y [2]
# y x1 x2
# <dbl> <dbl> <dbl>
#1 1 2 8
#2 2 4 NA
#3 1 3.5 6
#4 1 5 12
或者在將數據集split
為基於 'y' 列的data.frame
list
后應用na.aggregate
train[-1] <- unsplit(lapply(split(train[-1], train$y), na.aggregate), train$y)
考慮是否將ave
表示為是否包含在ifelse
中以表示NA
條件:
# ITERATE THROUGH ALL COLUMNS BUT FIRST
for(i in c("x1", "x2")) {
train[[i]] <- ifelse(test = is.na(train[[i]]),
yes = ave(train[[i]], train$y, FUN=function(x) mean(x, na.rm=TRUE)),
no = train[[i]])
}
train
# y x1 x2
# 1 1 2.0 8
# 2 2 4.0 NaN
# 3 1 3.5 6
# 4 1 5.0 12
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.