用列表的平均值替换列表中的所有NA编号

use*_*207 0 for-loop r

我是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);
    }
}
Run Code Online (Sandbox Code Playgroud)

但过了一会儿,我以为我只是计算了这些专栏,然后想出了这个:

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

它没有显示任何错误,但似乎也没有.当我输入数据时,它只是相同的数据框,但未经编辑.任何人都可以帮我这个吗?

mne*_*nel 5

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

赛跑

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

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

另一种方法是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)
Run Code Online (Sandbox Code Playgroud)

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

updatedData <- lapply(data, function(x) replace(x, is.na(x), mean(x, na.rm = TRUE)))
Run Code Online (Sandbox Code Playgroud)