我有收入,支出,人口和州的数据。收入,支出和人口缺失值。
我创建了一个for循环,用中位数替换缺失值,这是按状态计算的。但是我必须分别为收入,支出和人口运行for循环。我试图创建一个只传递列名的函数,但它给了我一个错误的is.na()。这是for循环
for (i in (unique(data$State))) {
data$Income[is.na(data$Income) & data$State==i] <-
median(data$Income[data$State==i], na.rm = TRUE)
}
代替收入,我尝试制作一个函数并传递x ..但它不起作用。有人可以帮助我实现这个功能。我尝试了一些东西,但它给了我一个错误的is.na
Med_sub <- function(x){
for (i in (unique(data$State))) {
data$x[is.na(data$x)&data$State==i] <- median(data$x[data$State==i], na.rm = TRUE)
}
}
Med_sub(Income)
Med_sub(Population)
我是R的新手。非常感谢任何帮助。
答案 0 :(得分:2)
考虑一个带有ave
的基础R双线程(内联聚合函数按因子对数字列进行切片)和ifelse
全部包含在sapply
循环中:
median_fill <- function(x) ifelse(is.na(x), median(x, na.rm=TRUE), x)
data[c("Income","spending","population")] <- sapply(data[c("Income","spending","population")],
function(i) ave(i, data$state, FUN=median_fill))
答案 1 :(得分:0)
tidyverse
三线:
library(dplyr)
data %>%
group_by(State) %>%
mutate_all(.funs = funs(coalesce(., median(., na.rm=TRUE))))