使用dplyr汇总芯片数据时丢失systemic_name列的求助
解决dplyr分组汇总丢失systemic_name列的问题
问题原因
你用summarise时,默认只会保留分组列(也就是group_by里的gene_name)和你主动计算的汇总列,其他列会被自动丢弃,这就是systemic_name消失的原因。
解决方案
根据gene_name和systemic_name的对应关系,分两种情况处理:
情况1:每个gene_name对应唯一的systemic_name(芯片数据最常见)
这种场景下,有两种简单处理方式:
方式1:将systemic_name加入分组
直接在group_by里同时指定gene_name和systemic_name,因为每个基因对应唯一的系统名,分组后不会影响均值计算,还能保留该列:
df_expression <- microarray_data |> group_by(gene_name, systemic_name) |> summarise( mean_log_fc = mean(log_fc, na.rm = TRUE), mean_ave_exp = mean(ave_expr, na.rm = TRUE), mean_p_val = mean(p_value, na.rm = TRUE), mean_adj_p_val = mean(adj_p_val, na.rm = TRUE), .groups = "drop" # 可选,取消数据的分组状态,方便后续操作 )
方式2:在summarise里提取唯一的systemic_name
如果不想修改分组,直接在summarise里用unique()提取该基因对应的唯一系统名(因为唯一,unique()会返回单个值):
df_expression <- microarray_data |> group_by(gene_name) |> summarise( systemic_name = unique(systemic_name), mean_log_fc = mean(log_fc, na.rm = TRUE), mean_ave_exp = mean(ave_expr, na.rm = TRUE), mean_p_val = mean(p_value, na.rm = TRUE), mean_adj_p_val = mean(adj_p_val, na.rm = TRUE), .groups = "drop" )
如果数据里有NA,可改成systemic_name = unique(na.omit(systemic_name))避免返回NA。
情况2:一个gene_name对应多个不同的systemic_name(较少见)
如果一个基因对应多个系统名,你需要先确定如何处理这些值:
- 保留第一个出现的:
systemic_name = first(systemic_name, na.rm = TRUE) - 保留最后一个出现的:
systemic_name = last(systemic_name, na.rm = TRUE) - 合并成逗号分隔的字符串:
systemic_name = paste(unique(systemic_name), collapse = ", ")
把对应代码替换到summarise里即可,示例:
df_expression <- microarray_data |> group_by(gene_name) |> summarise( systemic_name = paste(unique(systemic_name), collapse = ", "), mean_log_fc = mean(log_fc, na.rm = TRUE), mean_ave_exp = mean(ave_expr, na.rm = TRUE), mean_p_val = mean(p_value, na.rm = TRUE), mean_adj_p_val = mean(adj_p_val, na.rm = TRUE), .groups = "drop" )
补充说明
之前你尝试用select没用是正常的——select只是用来筛选列,但无法让summarise保留非分组、非汇总计算的列,必须通过上面的方式主动保留systemic_name。
内容的提问来源于stack exchange,提问作者Marcel Vlig
相关产品推荐
相关产品推荐

