遍历每一列以在 R 中插补数据,但不替换插补数据



我正在尝试使用 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这是围绕这个应用/映射想法的一组很好的工具。 例如,map_df将始终返回一个data.frame对象,则可以通过?map看到一堆map_x

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

相关内容

  • 没有找到相关文章

最新更新