首页 > 解决方案 > dplyr 用良好值的函数替换新列中的 NA

问题描述

最小示例:一个包含 6 行和 2 列对问题的回答以及一列 ID 的小型数据框

df <- data.frame(ID = c(rep("A", 3), rep("B", 2), "C"),
                 Q1 = sample(0:5, 10, replace=T),
                 Q2 = sample(0:3, 10, replace=T)
                )

我需要按 ID 创建一个具有 Q1 和 Q2 标准差的新数据框,所以写

questions <- c("Q1", "Q2")
df_sigma <- df %>%
              group_by(ID) %>%
                summarize(across(all_of(questions), 
                           .fns = sd, 
                           .names = paste0("Sigma_", "{.col}")))

这给了我

df_sigma
# A tibble: 3 x 3
  ID    Sigma_Q1 Sigma_Q2
  <chr>    <dbl>    <dbl>
1 A         1.73    0.577
2 B         2.12    1.41 
3 C        NA      NA    

用户 C 的 Q1 和 Q2 的标准差是 NA,因为它应该是 - 用户 C 只有一个条目。如何将每列中的 NA 替换为同一列中所有其他值的平均值或中值,例如, df_sigma[3, "Sigma_Q1"] = median(df_sigma[1, "Sigma_Q1"] , df_sigma[2, "Sigma_Q1"]) 和 Sigma_Q2 类似?一般来说,会有多个问题和相当多的NAs随机散布在列中。

提前谢谢了

托马斯飞利浦

标签: rdplyrna

解决方案


我们可以mutate使用replace

library(dplyr)
df_sigma2 <- df_sigma %>%
   mutate(across(starts_with("Sigma"),
        ~ replace(., is.na(.), median(., na.rm = TRUE))))

推荐阅读