如何用mutate()和mean()计算向量指定列名的行平均值?
如何通过指定列名列表计算行内平均值生成综合得分?
你需要基于给定的列名列表item_names,计算每行中对应列的平均值作为综合得分,之前的写法无法正常运行是因为在rowwise()环境里直接引用了整列数据,而非当前行的对应值。下面是两种可行的解决方案:
方案1:使用c_across() + all_of()(适配rowwise())
在dplyr的rowwise()上下文里,c_across()可以提取当前行指定列的数值,搭配all_of()来引用外部定义的列名向量:
item_names = c("item1", "item2") dat = dat %>% rowwise() %>% mutate(composite_score = mean(c_across(all_of(item_names)), na.rm = TRUE)) %>% ungroup() # 建议取消分组,避免后续操作受rowwise影响
all_of()确保正确识别外部的列名字符向量,避免列名不存在时的语法错误na.rm = TRUE用于忽略缺失值,可根据你的数据情况选择是否保留
方案2:使用rowMeans() + across()(更高效,无需rowwise())
如果你的数据集较大,推荐这种不需要rowwise()的写法,计算效率更高:
item_names = c("item1", "item2") dat = dat %>% mutate(composite_score = rowMeans(across(all_of(item_names)), na.rm = TRUE))
across()选中指定列后,rowMeans()直接对每行计算均值,省去了rowwise()的分组开销。
原代码失效原因
你之前写的mean(df[, names(df) %in% item_names])会直接提取整个数据集的指定列(所有行的数据),而不是当前行的数值,所以mean()计算的是整个列的均值,而非每行的行内均值,不符合需求。
内容的提问来源于stack exchange,提问作者Nick Khaligh
相关产品推荐
相关产品推荐

