问题描述
我想要做的是当我有多个具有相同 ID 的观察时计算平均值,当只有一个具有相同 ID 的观察时计算中位数。
car <- c("Mazda","Toyota Corolla","Duster","Cadillac","Maserati","Mazda","Ford","Toyota Corolla")
x <- c(3,4,2,3,NA,3)
x_2 <- c(3,3)
cars <- data.frame(car,x,x_2)
我想要的是获取缺失值的数据框的 ID,在这种情况下,只有玛莎拉蒂和马自达有缺失值,我希望 R 获取玛莎拉蒂的缺失值并用两者之间的平均值替换它们样本中的所有玛莎拉蒂,如果不满足此条件,我想取列的平均值,而对于马自达,我希望 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)
第三行创建了马自达的平均值,但第二行不创建列的中位数并分配给有缺失值的汽车。在这种情况下,玛莎拉蒂。另外,有没有一种方法可以为我的所有数据框执行此操作,而无需为每个变量运行这行代码。
这就是我需要的:
- 通过 ID 计算均值并将其用作缺失值的替换:示例:马自达缺失值应替换为样本中两个马自达之间的均值
- 如果没有与缺失值匹配的汽车,则用列的中位数替换缺失值:例如,我的样本中只有一辆玛莎拉蒂,因此我们取列的中值。
- 我想对我的所有数据框执行此操作并将其存储到相同的变量中:示例在相同的步骤中对 x 和 x_2 执行此操作,并将新值存储到相同的变量 x 和 x_2 中
解决方法
首先将 NA
替换为每个 mean
的 car
。如果 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,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