如何用dplyr基于重复Gene.names合并Case与Control列值到同行
基于dplyr合并重复基因行的解决方案
问题场景
现有如下tibble数据:
# A tibble: 4 × 3 Gene.names Case Control <chr> <dbl> <dbl> 1 A1BG 52 NA 2 A1BG NA 32 3 A2M 16 NA 4 A2M NA 15
可以看到Gene.names列存在重复值,Case和Control列分别对应有非空值,需要将每个Gene.names对应的Case和Control值合并到同一行,寻求基于dplyr的解决方案。
数据定义
df <- structure(list(Gene.names = c("A1BG", "A1BG", "A2M", "A2M"), Case = c(52, NA, 16, NA), Control = c(NA, 32, NA, 15)), row.names = c(NA, -4L), class = c("tbl_df", "tbl", "data.frame"))
dplyr解决方案
可以通过group_by按Gene.names分组,再用summarize结合across对每组的Case和Control列提取非NA值:
library(dplyr) df_cleaned <- df %>% group_by(Gene.names) %>% summarize(across(c(Case, Control), ~ first(na.omit(.x)))) %>% ungroup()
也可以用max(na.rm = TRUE)替代first(na.omit(.x)),因为每组中目标列仅存在一个非NA值,两种方式效果一致:
df_cleaned <- df %>% group_by(Gene.names) %>% summarize(across(c(Case, Control), ~ max(.x, na.rm = TRUE))) %>% ungroup()
预期输出
Gene.names Case Control <chr> <dbl> <dbl> 1 A1BG 52 32 2 A2M 16 15
内容的提问来源于stack exchange,提问作者cmirian
相关产品推荐
相关产品推荐

