我有一个数据框,其中
X1
列中缺少 NA 值,并且有一个分组变量 group
。我想用从该组的非 NA 值中采样的值替换所有 NA 值。除一组 (group==C
) 之外的所有组都应执行此操作。对于重新采样数据的条件替换,我在 if/else
的 case_when
命令中尝试了 mutate
和 dplyr
,但没有成功。我想这是因为 TRUE
和 FALSE
都在评估状况之前进行了评估。 (case_when 条件起作用并选择适当的情况,如计算 X2
时所示,但是使用示例命令会导致问题。)
#Original dataframe
df <-
data.frame(
id = 1:10,
group = c(rep("A",5),rep("B",4),"C"),
X1 = c(NA, 2, 1, NA,4, 3, NA, 8, 9, NA))%>%
group_by(group)%>%
mutate(X2 = case_when(is.na(X1)&group!="C"~3,
TRUE~2))
# Approach with if else (doesn't work)
df%>%
mutate(X3 = if(is.na(X1)&group!="C") sample(X1[!is.na(X1)],size=n(), replace = TRUE) else X1)
# Approach with case_when (doesn't work either)
df%>%
mutate(X3 = case_when(is.na(X1)&group!="C"~
~sample(X1[!is.na(X1)],size=n(), replace = TRUE),
TRUE~X1))
这是一个 tidyverse 解决方案。
df %>%
group_by(group) %>%
group_modify(
function(.x, .y) {
if (.y$group == "C") {
.x
} else {
nonMissing <- .x %>% filter(!is.na(X1)) %>% pull(X1)
.x %>%
mutate(
Temp = sample(nonMissing, nrow(.x), replace = TRUE),
X2 = ifelse(is.na(X1), Temp, X1)
) %>%
select(-Temp)
}
}
)
# A tibble: 10 × 4
# Groups: group [3]
group id X1 X2
<chr> <int> <dbl> <dbl>
1 A 1 NA 2
2 A 2 2 2
3 A 3 1 1
4 A 4 NA 1
5 A 5 4 4
6 B 6 3 3
7 B 7 NA 3
8 B 8 8 8
9 B 9 9 9
10 C 10 NA NA