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
相关产品推荐
相关产品推荐

