You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

dplyr中如何基于变量向量执行行级数据变换(如几何均值)

在dplyr中通过向量指定变量执行行级变换的解决方案

方法1:用c_across() + all_of()(dplyr 1.0.0+推荐)

any_of()/all_of()是变量选择器,不能直接传给计算函数,要配合c_across()在rowwise()环境下按行提取数值向量:

library(dplyr)
library(psych)

myvars = c("Sepal.Length","Sepal.Width")
iris2 = iris %>% 
  rowwise() %>% 
  mutate(geo.mean = geometric.mean(c_across(all_of(myvars)))) %>% 
  ungroup() # 完成行操作后建议取消分组,避免后续操作受分组影响

c_across()专门用于在rowwise()分组中提取每行的多列数据为向量,all_of()负责从向量myvars中匹配列名,完全等价于你预期的c(Sepal.Length, Sepal.Width)写法,同时保留所有原变量。

方法2:dplyr版本兼容方案(解决1.1.0升级问题)

如果pick()/c_across()因版本报错,可改用cur_data()提取当前行数据,再按向量筛选列:

iris2 = iris %>% 
  rowwise() %>% 
  mutate(geo.mean = geometric.mean(cur_data()[myvars])) %>% 
  ungroup()

cur_data()返回当前行的所有列数据,[myvars]直接筛选指定变量,同样能生成每行的数值向量传入计算函数。

方法3:无rowwise()的高效向量化实现

rowwise()在大数据集上效率偏低,可直接用apply()结合变量选择器实现:

iris2 = iris %>% 
  mutate(geo.mean = apply(select(., all_of(myvars)), 1, geometric.mean))

select(., all_of(myvars))先筛选目标列,apply(..., 1, ...)按行对筛选后的列执行几何均值计算,全程无需分组,速度更快。


内容的提问来源于stack exchange,提问作者G_biof

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 05:20:27