当有多个个体时如何通过 ID 计算平均值,当 R 中只有一个缺失值时如何计算中值?

How calculate the mean by ID when there is more than one individual and the median when there is only one for missing values in R?

我想做的是当我有多个具有相同 ID 的观察时计算平均值,当只有一个具有相同 ID 的观察时计算中位数。

car <- c("Mazda", "Toyota Corolla", "Duster",
         "Cadillac", "Maserati", "Mazda", "Ford", "Mazda", "Toyota Corolla")
x <- c(3,4,2,3,NA,4,2,NA,3)
x_2 <- c(3,4,2,3,NA,4,2,NA,3)
cars <- data.frame(car,x,x_2)

我想要的是获取具有缺失值的数据框的 ID,在这种情况下,只有 Maserati 和 Mazda 具有缺失值,我希望 R 获取 Maserati 的缺失值并将它们替换为样本中所有玛莎拉蒂之间的平均值,如果不满足此条件,我想取该列的平均值,而对于马自达,我希望 R 做同样的事情,因为有不止一个马自达我想取所有马自达之间的平均值汽车并用马自达汽车之间的平均值替换缺失值。

这就是我所做的

library(dplyr)
library(zoo)
cars <- cars %>% group_by(car) %>% mutate(x = na.aggregate(x))
cars$x <- ifelse(is.na(cars$x)==TRUE, median(x),x)

第三行创建 Mazda 的平均值,但第二行不创建列的中值并分配给具有缺失值的汽车。在这种情况下,玛莎拉蒂。另外,有没有一种方法可以对我的所有数据框执行此操作,而无需 运行 每个变量的这行代码。

这是我需要的:

  1. 通过ID计算均值,作为缺失值的替代:例:马自达缺失应该用样本中两个马自达之间的均值替代
  2. 如果没有与缺失值匹配的汽车,请将缺失值替换为列的中值:例如,我的样本中只有一辆玛莎拉蒂,因此我们取列的中值。
  3. 我想对我的所有数据框执行此操作并将其存储到相同的变量中:示例以相同的步骤对 x 和 x_2 执行此操作并将新值存储到相同的变量 x 和 x_2

首先将每个 car 中的 NA 替换为 mean。如果 NA 仍然存在,请将其替换为该列的 median

library(dplyr)

cars %>%
  group_by(car) %>%
  mutate(across(c(x, x_2), ~replace(., is.na(.), mean(., na.rm = TRUE)))) %>%
  ungroup() %>%
  mutate(across(c(x, x_2), ~replace(., is.na(.), median(., na.rm = TRUE))))

#   car             x   x_2
#  <chr>          <dbl> <dbl>
#1 Mazda            3     3  
#2 Toyota Corolla   4     4  
#3 Duster           2     2  
#4 Cadillac         3     3  
#5 Maserati         3     3  
#6 Mazda            4     4  
#7 Ford             2     2  
#8 Mazda            3.5   3.5
#9 Toyota Corolla   3     3