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

Posted

技术标签:

【中文标题】在包含 is.na() 和中位数的 R 函数中传递列名【英文标题】:Passing column names in R function containing is.na() and median 【发布时间】: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 【参考方案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)) 

【讨论】:

以上是关于在包含 is.na() 和中位数的 R 函数中传递列名的主要内容,如果未能解决你的问题,请参考以下文章

R 函数错误

R语言-均值填充缺失值

R初级数据管理——缺失值NA的处理

在R中删除带有NA的行[重复]

R语言na.omit函数删除NA值实战

r语言中怎样查看函数源代码