0

我正在尝试使用 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 也没有估算数据。

4

2 回答 2

1

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_x你可以看到?map

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

我知道最好使用基本的 R 函数,但purrr会使apply样式操作变得更加容易。

于 2017-01-22T14:05:16.057 回答
1

我们可以使用na.aggregatefrom zoowhich 可以直接应用于数据集

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

于 2017-01-22T14:35:17.750 回答