我不知道如何循环每列以使用列均值替换NA值。当我尝试使用以下代码替换一列时,它运行良好。
Column1[is.na(Column1)] <- round(mean(Column1, na.rm = TRUE))
循环列的代码不起作用:
for(i in 1:ncol(data)){
data[i][is.na(data[i])] <- round(mean(data[i], na.rm = TRUE))
}
不替换值。有人可以帮帮我吗?
答案 0 :(得分:52)
对代码进行相对简单的修改可以解决问题:
for(i in 1:ncol(data)){
data[is.na(data[,i]), i] <- mean(data[,i], na.rm = TRUE)
}
答案 1 :(得分:43)
如果DF
是数字列的数据框:
library(zoo)
na.aggregate(DF)
增加:
仅使用R的基数定义一个函数,该函数为一列执行,然后为每列提供lapply:
NA2mean <- function(x) replace(x, is.na(x), mean(x, na.rm = TRUE))
replace(DF, TRUE, lapply(DF, NA2mean))
如果可以覆盖输入,则可以用以下内容替换最后一行:
DF[] <- lapply(DF, NA2mean)
答案 2 :(得分:10)
要使用@ akrun的示例数据添加替代方案,我会执行以下操作:
d1[] <- lapply(d1, function(x) {
x[is.na(x)] <- mean(x, na.rm = TRUE)
x
})
d1
答案 3 :(得分:5)
您也可以尝试:
cM <- colMeans(d1, na.rm=TRUE)
indx <- which(is.na(d1), arr.ind=TRUE)
d1[indx] <- cM[indx[,2]]
d1
set.seed(42)
d1 <- as.data.frame(matrix(sample(c(NA,0:5), 5*10, replace=TRUE), ncol=10))
答案 4 :(得分:4)
lapply
代替for
循环。
d1[] <- lapply(d1, function(x) ifelse(is.na(x), mean(x, na.rm = TRUE), x))
这与for循环相比没有任何优势,但如果你有非数字列也可能更容易,在这种情况下
d1[sapply(d1, is.numeric)] <- lapply(d1[sapply(d1, is.numeric)], function(x) ifelse(is.na(x), mean(x, na.rm = TRUE), x))
几乎一样容易。
答案 5 :(得分:2)
# Lets say I have a dataframe , df as following -
df <- data.frame(a=c(2,3,4,NA,5,NA),b=c(1,2,3,4,NA,NA))
# create a custom function
fillNAwithMean <- function(x){
na_index <- which(is.na(x))
mean_x <- mean(x, na.rm=T)
x[na_index] <- mean_x
return(x)
}
(df <- apply(df,2,fillNAwithMean))
a b
2.0 1.0
3.0 2.0
4.0 3.0
3.5 4.0
5.0 2.5
3.5 2.5
答案 6 :(得分:2)
还可以使用 imputeTS 包快速解决方案:
library(imputeTS)
na.mean(yourDataFrame)
答案 7 :(得分:1)
与@Thomas指出的答案类似,
这也可以使用R的ifelse()
方法完成:
for(i in 1:ncol(data)){
data[,i]=ifelse(is.na(data[,i]),
ave(data[,i],FUN=function(y) mean(y, na.rm = TRUE)),
data[,i])
}
其中,
ifelse(TEST, YES , NO)
的参数是: -
TEST - 要检查的逻辑条件
是 - 如果条件为真,则执行
否 - 当条件为假时
和ave(x, ..., FUN = mean)
是R中用于计算x []
答案 8 :(得分:1)
使用tidyr's replace_na的单线是
library(tidyr)
replace_na(mtcars,as.list(colMeans(mtcars,na.rm=T)))
答案 9 :(得分:0)
@Query
的{{1}}或dplyr
在这里可能有用:
mutate_all
答案 10 :(得分:0)
简单地使用Zoo,它将简单地用列值的平均值替换所有NA值:
na.aggregate(data)
答案 11 :(得分:0)
使用data.table包,您可以使用set()
函数并在列上循环,并用您选择的集合或值替换NA
或任何您喜欢的内容(此处:意思是):
require(data.table)
# data
dt = copy(iris[ ,-5])
setDT(dt)
dt[1:4, Sepal.Length := NA] # introduce NAs
# replace NAs with mean (or whatever function you like)
for (j in seq_along(names(dt))) {
set(dt,
i = which(is.na(dt[[j]])),
j = j,
value = mean(dt[[j]], na.rm = TRUE))
}