在包含 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 函数中传递列名的主要内容,如果未能解决你的问题,请参考以下文章