R 如何使用“按组平均值”插补缺失值并替换现有值

R 如何使用“按组平均值”插补缺失值并替换现有值,r,R,我有一个纵向数据集,包含第一次就诊时的身高数据。其他行是空的。 但有时一个人有两种价值观和两种不同的价值观。 我想用组的平均值替换缺少的值,并用平均值替换现有值。我试过: data$variable <- ave(data$variable, data$group, FUN = function(x) ifelse(is.na(x), mean(x, na.rm = TRUE), x)) 此代码将丢失的值替换为平均高度,但仍保留现有高度。在这种

我有一个纵向数据集,包含第一次就诊时的身高数据。其他行是空的。 但有时一个人有两种价值观和两种不同的价值观。 我想用组的平均值替换缺少的值,并用平均值替换现有值。我试过:

data$variable <- ave(data$variable, data$group, 
                     FUN = function(x) ifelse(is.na(x), mean(x, na.rm = TRUE), x))

此代码将丢失的值替换为平均高度,但仍保留现有高度。

在这种情况下,以下是用每组物种的平均值替换丢失值的示例。诚然,这不是最优雅的解决方案

library(tidyverse)

# creating an example data with NA inserted randomly for 20 values of Petal.Length
set.seed(4)
row_with_na <- sample(1:nrow(iris), 20)
iris[row_with_na, "Petal.Length"] <- NA

# generate the mean of Petal.Length by the Species     
ref <- iris %>% group_by(Species) %>% summarise(mean_petal_length = mean(Petal.Length, na.rm=TRUE))

# replace the NA based on Species

iris %>% mutate(Petal.Length = ifelse(is.na(Petal.Length) & Species == "setosa", ref[ref$Species == "setosa", "mean_petal_length"],
                                      ifelse(is.na(Petal.Length) & Species == "versicolor", ref[ref$Species == "versicolor", "mean_petal_length"],
                                             ifelse(is.na(Petal.Length) & Species == "virginica", ref[ref$Species == "virginica", "mean_petal_length"], Petal.Length))))

我的理解是,缺少的值由组替换,对于组中有重复的ID,这些特定ID需要具有其中两个的平均值

因此,您需要执行两个功能:

data$variable <- ave(data$variable, data$group, 
                     FUN = function(x) ifelse(is.na(x), mean(x, na.rm = TRUE), x))

data$variable <- ave(data$variable, data$group, data$ID,
                     FUN = mean)
和数据表:


不幸的是,我有1532个不同的ID。哈哈~!这就是为什么我说这不是一个优雅的解决方案@科尔的解决方案是非常好的。一定要测试一下。
library(dplyr)

data <- data%>%
  group_by(group)%>%
  mutate(variable = coalesce(variable, mean(variable, na.rm = TRUE)))%>%
  group_by(ID, add = T)%>%
  mutate(variable = mean(variable))%>%
  ungroup()
library(data.table)

setDT(data)
data[, variable := ifelse(is.na(variable), mean(variable, na.rm = T), variable), by = group]
data[, variable := mean(variable), by = .(ID, group)]