如何在tidyverse中批量计算含NA的多列行均值(无需列名枚举)
解决tidyverse中批量列行均值计算的问题
错误原因
你使用c(A1:C3)的写法逻辑错误:这里的:不是用来选择列范围,而是尝试生成数值序列(比如第二行中A1=50、C3=NA,执行50:NA会直接抛出NA/NaN错误),这个错误发生在调用mean()之前,因此na.rm参数根本没机会生效。
两种可行解决方案
方案1:c_across() + rowwise()(直观适配行操作)
c_across()是tidyverse专门为行级操作设计的函数,支持用列范围(如A1:C3)选中行内所有目标列的数值,配合rowwise()实现行均值计算:
data1 <- data %>% rowwise() %>% mutate(m = mean(c_across(A1:C3), na.rm = TRUE)) %>% ungroup() # 完成后取消行分组,避免后续操作性能下降
方案2:rowMeans() + across()(无分组,效率更高)
如果数据集较大,rowwise()的性能开销会很明显,推荐直接用rowMeans结合across()选择列范围,无需行分组:
data1 <- data %>% mutate(m = rowMeans(across(A1:C3), na.rm = TRUE))
验证结果
以你的示例数据为例,两种方法都会正确计算:
- 第一行(SampleID=5):所有54列无NA,均值为对应列数值的算术平均
- 第二行(SampleID=6):自动忽略所有NA值,仅计算非NA列的均值
内容的提问来源于stack exchange,提问作者ksinva
相关产品推荐
相关产品推荐

