我的数据大致如下:
df <- dplyr::tibble(id = c(1, 1, 2, 2, 3, 4, 4, 5),
gender = c("m", "m", "w", "w", "w", "m", "m", "w"),
age_group = c(1, 1, 2, 2, 2, 1, 1, 2),
lab1 = c(NA, 3, 2, 3, NA, NA, 4, 1),
lab2 = c(5, 4, NA, NA, 1, NA, 3, 5))
# A tibble: 8 x 5
id gender age_group lab1 lab2
<dbl> <chr> <dbl> <dbl> <dbl>
1 1 m 1 NA 5
2 1 m 1 3 4
3 2 w 2 2 NA
4 2 w 2 3 NA
5 3 w 2 NA 1
6 4 m 1 NA NA
7 4 m 1 4 3
8 5 w 2 1 5
当然,我的真实数据要复杂得多,也大得多,但是这个例子应该足以解释我想做什么。这都是关于lab1
和lab2
列的NA
值的推算。我能想到的一个简单方法是用mean
值或median
值替换NAs
,这些值相对于整体。然而,由于我有每个人的gender
和age group
,我想用属于相同性别和年龄组的值的平均值来替换缺失的值.
因此,在上面的例子中,lab1
的第一个缺失值来自male
并且属于age_group 1
的人。所以我想用lab1的平均值来计算这个值性别为男性且age_group==1的所有其他行.
是否有办法实现这一点与dplyr管道并并行多个实验室值?
您可以使用以下-
library(dplyr)
df %>%
mutate(across(starts_with('lab'), ~replace(., is.na(.), mean(., na.rm = TRUE))),
.by = c(gender, age_group))
# id gender age_group lab1 lab2
# <dbl> <chr> <dbl> <dbl> <dbl>
#1 1 m 1 3.5 5
#2 1 m 1 3 4
#3 2 w 2 2 3
#4 2 w 2 3 3
#5 3 w 2 2 1
#6 4 m 1 3.5 4
#7 4 m 1 4 3
#8 5 w 2 1 5