使用r替换完整数据集中的na值

时间:2015-06-24 18:33:01

标签: r data-manipulation

我正在处理一个标记为“?”的缺失值很少的数据集,我必须用该列的最常见值(模式)替换它们。但是,我想编写一个代码,立即为整个数据集运行它。

我到目前为止 -

df <- read.csv("mushroom.txt", na.strings = "?",header=FALSE)

现在,尝试使用该列的模式替换文件中的所有NA值。请帮忙。

5 个答案:

答案 0 :(得分:1)

replaceQuestions <- function(vector) {

  mostCommon <- names(sort(table(vector), decreasing = TRUE))[1]

  vector[vector == '?'] <- mostCommon

  vector

}

df <- apply(df, 2, replaceQuestions)

不可重复,所以我不确定这是否是您所寻找的,但这解决了我所解释的问题。

答案 1 :(得分:1)

由于您希望通过应用并使用is.na标识要替换的列来替换您希望以列方式操作的列的模式。

apply(df, 2, function(x){ 
    x[is.na(x)] <- names(which.max(table(x)))
    return(x) })

请注意,apply会返回matrix,因此如果您需要data.frame,则需要使用as.data.frame进行转换

答案 2 :(得分:1)

正如你在问题中所说的那样,你在csv阅读期间用"?"替换了NA,所以我认为这可能有所帮助:

apply(df,2,function(x) gsub("\\?",names(sort(-table(x,exclude="?")))[1],x))

exclude部分是为了避免选择"?",它是否是最常见的值。 \\是逃避特殊角色?到gsub。

====== 编辑添加 ======

gsub会将所有内容转换为文字,您需要再次将其恢复为数字:

a<-apply(df,2,function(x) gsub("\\?",names(sort(-table(x,exclude="?")))[1],x))
new_df<-as.data.frame(apply(a,2,as.numeric))

最后一行将产生一个新的数据框

答案 3 :(得分:0)

或者:

apply(df, 2, function(x) {
  x[is.na(x)] <- Mode(x[complete.cases(x)])
  x})

这使用SO上众所周知的Mode功能。链接到函数Is there a built-in function for finding the mode?

Mode <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}

答案 4 :(得分:0)

使用

for (i in ncol(dataframename){
   dataframename[i]=
   ifelse(is.na(dataframename[i]),mode(dataframename[i]),dataframename[i])
}