在包含is.na()和中位数的R函数中传递列名

时间:2017-06-24 22:58:23

标签: r

我有收入,支出,人口和州的数据。收入,支出和人口缺失值。

我创建了一个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的新手。非常感谢任何帮助。

2 个答案:

答案 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))))