【问题标题】:Passing column names in R function containing is.na() and median在包含 is.na() 和中位数的 R 函数中传递列名
【发布时间】:2017-11-28 05:31:28
【问题描述】:

我有收入、支出、人口和状态的数据。收入、支出和人口存在缺失值。

我创建了一个 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 新手。任何帮助将不胜感激。

【问题讨论】:

  • 能否提供一个工作数据集?
  • 它给你什么错误信息?您的数据是真的NA 还是有空格/字符?
  • 你可以举个例子: data

标签: r


【解决方案1】:

一个tidyverse三线:

library(dplyr)

data %>%
  group_by(State) %>%
  mutate_all(.funs = funs(coalesce(., median(., na.rm=TRUE))))

【讨论】:

    【解决方案2】:

    考虑一个带有ave(按因子对数值列进行切片的内联聚合函数)和ifelse 的基本R 两行代码,它们都包含在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)) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 2015-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多