使用 dplyr 逐组将 NA 替换为非 NA 的采样值

问题描述 投票:0回答:1

我有一个数据框,其中

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))
r dplyr conditional-statements sample mutate
1个回答
0
投票

这是一个 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
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.