我是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)
它没有显示任何错误,但似乎也没有.当我输入数据时,它只是相同的数据框,但未经编辑.任何人都可以帮我这个吗?
您的函数的问题在于它是一个函数,因此范围仅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)