遍历每一列以估算 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
我正在尝试使用 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