0

我对 R 完全陌生,我一直在尝试NA用每列的平均值替换这些值。我已经尝试了很多选择。但似乎没有一个工作。我已经尝试过这个和许多类似的,但我不断得到:argument is not numeric or logical: returning NA

script<-function() {
for (i in names(data)) {
        data[[i]][is.na(data[[i]])] <- mean(data[[i]], na.rm=TRUE);
    }
}

但过了一会儿,我想我应该数一下列并想出这个:

script<-function() {
    for (i in 1:20) {
        data[[i]][is.na(data[[i]])] <- mean(data[[i]], na.rm=TRUE);
    }
}

它没有显示任何错误,但似乎也不起作用。当我输入数据时,它只是相同的数据框,但未经编辑。谁能帮我解决这个问题?

4

2 回答 2

5

您的函数的问题在于它是一个函数,因此范围仅data在函数范围内更新

跑步

for (i in names(data)) {
        data[[i]][is.na(data[[i]])] <- mean(data[[i]], na.rm=TRUE);
            }
       }

不在函数内将按您的意愿工作。

data另一种方法是作为参数传递

imputeMean <-function(data) {

    for (i in names(data)) {
    data[[i]][is.na(data[[i]])] <- mean(data[[i]], na.rm=TRUE);
        }
    return(data)
   }
# then you can save the result as a new object

updatedData <- imputeMean(data)

请注意,对于命名列表(原样data),[[<-每次都会复制,因此您可以使用lapply

updatedData <- lapply(data, function(x) replace(x, is.na(x), mean(x, na.rm = TRUE)))
于 2013-04-30T02:03:22.833 回答
0

随意使用此功能(根据mnel更正更新):

data.frame(lapply(data, function(x){replace(x, is.na(x), mean(x,na.rm=T))}))
于 2013-04-30T03:51:54.347 回答