用 R 中的分组方法替换 NA?
Replace NA with grouped means in R?
我一直在尝试用手段替换 NA,非常感谢您的帮助。
我想用列内组的平均值替换数据框多列中的 NA。在下面的示例中,我想用 14.5 替换 x1 中的 NA,因为 13 和 16 在第 1 个月。x2 中的 NA 应该替换为 4.5。
这是我试过的方法:
library(tidyverse)
df <- tibble(x1 = c(13, NA, 16, 17, 16, 12), x2 = c(1, 4, 4, 3, 5, NA),
month = c(1, 1, 1, 2, 2, 2))
by_month <- group_by(df, month)
for (i in length(df)){
for (j in nrow(df[[,i]])){
if(is.na(df[[j, i]])){
df[[j, i]] <- summarize(by_month[[j, i]],
group_mean = mean(df[[, i]], na.rm=TRUE))
}
else{
df[[j, i]] <- df[[j, i]]
}
}
}
但是,我刚刚得到错误 'argument "..1" is missing, with no default',我对此进行了调查 - 但它没有帮助。任何帮助都会很棒:)
我稍微改变了你的例子,因为你提供的数据框有不同长度的列,但这应该可以解决你的问题:
首先,我在 tidyverse 中加载了包。然后我按月对数据进行分组。第二个管道运行 mutate_all 函数,因此它会自动更改所有列。
library(tidyverse)
df <- tibble(x1 = c(13, NA, 16, 17, 16, 12), x2 = c(1, 4, 3, 5, NA, 4),
month = c(1, 1, 1, 2, 2, 2))
new_df <- df %>% group_by(month) %>%
mutate_all(funs(ifelse(is.na(.), mean(., na.rm = TRUE),.)))
如果这对您有帮助,请告诉我。
这是一个基本的 R 解决方案,使用 ave
和 sapply
-ing 到每一列 x1
和 x2
。
df[1:2] <- sapply(df[1:2], function(x){
ave(x, df[[3]], FUN = function(.x) {
.x[is.na(.x)] <- mean(.x, na.rm = TRUE)
.x
})
})
df
## A tibble: 6 x 3
# x1 x2 month
# <dbl> <dbl> <dbl>
#1 13 1 1
#2 14.5 4 1
#3 16 4 1
#4 17 3 2
#5 16 5 2
#6 12 4 2
我一直在尝试用手段替换 NA,非常感谢您的帮助。
我想用列内组的平均值替换数据框多列中的 NA。在下面的示例中,我想用 14.5 替换 x1 中的 NA,因为 13 和 16 在第 1 个月。x2 中的 NA 应该替换为 4.5。
这是我试过的方法:
library(tidyverse)
df <- tibble(x1 = c(13, NA, 16, 17, 16, 12), x2 = c(1, 4, 4, 3, 5, NA),
month = c(1, 1, 1, 2, 2, 2))
by_month <- group_by(df, month)
for (i in length(df)){
for (j in nrow(df[[,i]])){
if(is.na(df[[j, i]])){
df[[j, i]] <- summarize(by_month[[j, i]],
group_mean = mean(df[[, i]], na.rm=TRUE))
}
else{
df[[j, i]] <- df[[j, i]]
}
}
}
但是,我刚刚得到错误 'argument "..1" is missing, with no default',我对此进行了调查 - 但它没有帮助。任何帮助都会很棒:)
我稍微改变了你的例子,因为你提供的数据框有不同长度的列,但这应该可以解决你的问题:
首先,我在 tidyverse 中加载了包。然后我按月对数据进行分组。第二个管道运行 mutate_all 函数,因此它会自动更改所有列。
library(tidyverse)
df <- tibble(x1 = c(13, NA, 16, 17, 16, 12), x2 = c(1, 4, 3, 5, NA, 4),
month = c(1, 1, 1, 2, 2, 2))
new_df <- df %>% group_by(month) %>%
mutate_all(funs(ifelse(is.na(.), mean(., na.rm = TRUE),.)))
如果这对您有帮助,请告诉我。
这是一个基本的 R 解决方案,使用 ave
和 sapply
-ing 到每一列 x1
和 x2
。
df[1:2] <- sapply(df[1:2], function(x){
ave(x, df[[3]], FUN = function(.x) {
.x[is.na(.x)] <- mean(.x, na.rm = TRUE)
.x
})
})
df
## A tibble: 6 x 3
# x1 x2 month
# <dbl> <dbl> <dbl>
#1 13 1 1
#2 14.5 4 1
#3 16 4 1
#4 17 3 2
#5 16 5 2
#6 12 4 2