我正在尝试使用 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