遍历每一列以估算 R 中的数据但不替换估算数据

looping over each column to impute data in R but does not replace imputed data

我正在尝试使用 Hmisc 估算模型估算数据框。我能够一次为一列估算数据,但无法遍历列。

下面的示例 - 工作正常,但我想使用函数使其动态化:

impute_marks$col1 <- with(impute_marks, round(impute(col1, mean)),0)

示例:

impute_dataframe <- function()
{
  for(i in 1:ncol(impute_marks))
  {
    impute_marks[is.na(impute_marks[,i]), i] <- with(impute_marks, round(impute(impute_marks[,i], mean)),0)
  }
}
impute_dataframe 

当我 运行 函数时没有错误,但数据集 impute_marks 也没有估算数据。

Hmisc::impute 已经是一个函数,为什么不直接使用 apply 并保存一个 for 循环?:

library(Hmisc)
age1 <- c(1,2,NA,4)
age2 <- c(NA, 4, 3, 1)
mydf <- data.frame(age1, age2)

mydf
  age1 age2
1    1   NA
2    2    4
3   NA    3
4    4    1

apply(mydf, 2, function(x) {round(impute(x, mean))})
  age1 age2
1    1    3
2    2    4
3    2    3
4    4    1

编辑:要将 mydf 保留为 data.frame,您可以像这样将其合并:

mydf <- as.data.frame(mydf)

但我要做的是使用另一个包 purrr,这是围绕这个 apply/mapping 想法的一套很好的工具。 map_df 例如总是 return 一个 data.frame 对象,有一堆 map_x 你可以看到 ?map

library(purrr)
map_df(mydf, ~ round(impute(., mean)))

我知道最好使用基本的 R 函数,但是 purrr 使 apply 风格的操作变得容易得多。

我们可以使用 zoo 中的 na.aggregate,它可以直接应用于数据集

library(zoo)
round(na.aggregate(mydf))
#  age1 age2
#1    1    3
#2    2    4
#3    2    3
#4    4    1

或在每一列中分别使用 lapply

mydf[] <- lapply(mydf, function(x) round(na.aggregate(x)))

默认情况下,na.aggregate 给出 mean。但是,我们可以改变 FUN