使用dplyr行方向汇总统计时mean、sd函数异常问题求助
R中行方向tidyverse汇总统计的问题分析与解决方案
问题原因
sum()的参数设计支持接收多个独立数值(例如sum(a, b, c)等价于sum(c(a,b,c))),因此!!!syms(colnames(.))将列名拆分为单独变量传入时,sum能正确计算行总和。mean()和sd()的第一个参数要求是单个向量,后续仅支持trim、na.rm这类控制参数。当传入mean(foo, bar, foobar)时,函数会把foo当作待计算的向量,bar被误识别为trim参数(因数值不符合trim范围被忽略,最终仅返回foo列的均值);sd()则因传入多余的位置参数,直接触发参数不匹配错误。
tidyverse通用替代方案
使用dplyr专为rowwise()设计的c_across()函数,它能将当前行的指定列转换为向量,适配所有需要向量输入的行方向分析,是apply的tidyverse替代方案:
基础用法示例
library(tidyverse) # 无NA数据集测试 df1 <- tibble(foo = c(1,5,2), bar = c(10,1,3), foobar = c(6,3,5)) # 行均值 df1 %>% rowwise() %>% mutate(m = mean(c_across(everything()))) # 行标准差 df1 %>% rowwise() %>% mutate(sd_val = sd(c_across(everything()))) # 含NA数据集测试 df2 <- tibble(foo = c(1,5,2), bar = c(10,NA,3), foobar = c(6,3,5)) # 忽略NA的行均值 df2 %>% rowwise() %>% mutate(m = mean(c_across(everything()), na.rm = TRUE)) # 忽略NA的行标准差 df2 %>% rowwise() %>% mutate(sd_val = sd(c_across(everything()), na.rm = TRUE))
灵活列选择
c_across()支持所有dplyr列选择器,可针对特定列计算:
# 仅计算以"foo"开头的列的行均值 df1 %>% rowwise() %>% mutate(foo_mean = mean(c_across(starts_with("foo"))))
批量计算多统计量
若需一次性计算多个行方向统计值,可直接在mutate()中批量赋值:
df1 %>% rowwise() %>% mutate( row_sum = sum(c_across(everything())), row_mean = mean(c_across(everything())), row_sd = sd(c_across(everything())) )
内容的提问来源于stack exchange,提问作者sharp-spark
相关产品推荐
相关产品推荐

