【问题标题】:Replacing missing data in a categorical variable in R替换R中分类变量中的缺失数据
【发布时间】:2014-10-04 03:53:44
【问题描述】:

我不确定如何编写一个函数来替换一系列分类向量中的 NA 数据。

考虑以下问题:我有一个包含 NA 数据的分类向量,我想根据现有数据的比例替换 NA 数据。

例如,

a<-factor(c("yes","no","no","yes","yes","yes","no","yes","yes","yes","yes","yes",NA, NA))

我写了以下代码:

a[is.na(a)]<-sample(c("yes","no"),sum(is.na(a)),replace=TRUE,
prob=c(sum(na.omit(a=="yes"))/sum(!is.na(a)),sum(na.omit(a=="no"))/sum(!is.na(a)))) 

## replace NA with yes or no according to the proportion of yes/no in the non-NA data

上面的代码工作正常,但现在我有一个包含许多分类变量的数据框。 例如:

a<-c("yes","no","no","yes","yes","yes","no","yes","yes","yes","yes","yes",NA, NA)
b<-c("red","blue","white","red","blue","red","blue","red","blue","red","blue",NA,NA,NA)
c<-c(1,3,2,1,2,3,1,2,3,1,2,3,NA,NA)

a<-as.factor(a)   ## ensure the vectors are treated as categorical variable
b<-as.factor(b)
c<-as.factor(c)

df<-data.frame(a=a,b=b,c=c)

我正在努力编写一个函数,该函数允许我替换此类数据框中所有分类变量中的 NA 数据。请注意,每个变量可能有两个以上的类别。

【问题讨论】:

  • bc 列中,您希望prob 怎么样
  • 所以 b 是 prob=c(sum(na.omit(b=="red"))/sum(!is.na(a)),sum(na.omit(b=="blue"))/sum(!is.na(a)),sum(na.omit(b=="white"))/sum(!is.na(a))) 而 c 是 prob=c(sum(na.omit(c==1))/sum(!is.na(a)),sum(na.omit(c==2))/sum(!is.na(a)),sum(na.omit(c==3))/sum(!is.na(a)))
  • 为什么is.na(a) 用于计算b 列中的概率?
  • 所以 b 将是 prob=c(sum(na.omit(b=="red"))/sum(!is.na(b)),sum(na.omit(b=="blue"))/sum(!is.na‌​(b)),sum(na.omit(b=="white"))/sum(!is.na(b))) 而 c 将是 prob=c(sum(na.omit(c==1))/sum(!is.na(c)),sum(na.omit(c==2))/sum(!is.na(c)),sum(‌​na.omit(c==3))/sum(!is.na(c)))
  • 这相当于 David Arenburg 的 prob 函数

标签: r function na


【解决方案1】:

我会创建一些辅助函数并执行以下操作

helperFunc <- function(x){
  sample(levels(x), sum(is.na(x)), replace = TRUE,
         prob = as.numeric(table(x))/sum(!is.na(x)))   
}

df[sapply(df, is.na)]  <- unlist(sapply(df, helperFunc))

测试一些随机种子(例如,123)

set.seed(123)
df[sapply(df, is.na)]  <- unlist(sapply(df, helperFunc))
df
#      a     b c
# 1  yes   red 1
# 2   no  blue 3
# 3   no white 2
# 4  yes   red 1
# 5  yes  blue 2
# 6  yes   red 3
# 7   no  blue 1
# 8  yes   red 2
# 9  yes  blue 3
# 10 yes   red 1
# 11 yes  blue 2
# 12 yes   red 3
# 13 yes  blue 2
# 14  no white 3

【讨论】:

  • 非常感谢!!你能解释一下辅助函数在做什么吗?我不确定我是否完全理解。
  • 辅助函数所做的事情与您的原始代码所做的事情完全相同。 as.numeric(table(x)) 只是x 中所有唯一值的频率,我将它除以sum(!is.na(x)),即x 的长度,没有NAs。这样就创建了一个概率向量
  • 这可能是一个非常愚蠢的问题——但是为什么当你在 sapply 中调用辅助函数时,你不需要helperFunc(df)
  • 因为这是sapply 语法的工作方式(或所有apply 系列)。你给它一个数据集,它会将每一列解析为指定的函数。
猜你喜欢
  • 2018-02-17
  • 2020-11-14
  • 2019-12-01
  • 2021-07-18
  • 1970-01-01
  • 1970-01-01
  • 2020-11-14
  • 2019-08-06
  • 1970-01-01
相关资源
最近更新 更多