关于rowwise()与c_across()计算行均值差异的技术咨询
为啥两种计算行均值的方法结果不一样?
嘿,这个问题问得太到位了!我来给你唠明白这俩方法的核心差异~
先看你写的第一种方法:
df %>% select(starts_with('var')) %>% rowwise() %>% mutate(avg=mean(., na.rm=T))
这里的坑出在mutate()里的.!你可能以为.代表当前行的那几个var变量,但在dplyr的mutate()函数里,.指代的是整个前面传过来的rowwise数据框(也就是你select后的三列数据)。所以你调用mean(., na.rm=T)的时候,其实是在计算整个数据框里所有元素的平均值,然后把这个单一值复制到每一行的avg列里——这当然不是你想要的行均值啦!
再看第二种可行的方法:
df %>% rowwise() %>% mutate(avg= mean( c_across(starts_with('var')), na.rm=T) )
这里的关键是c_across()函数!它是dplyr专门为rowwise()环境量身定做的工具:当你在按行分组的时候,c_across(starts_with('var'))会精准地把当前行里所有符合条件的列(这里是var开头的三个列)打包成一个数值向量,然后你对这个向量用mean(),自然就计算出了当前行的均值(还能通过na.rm=T忽略缺失值),这才是你真正想要的结果。
简单总结一下:
- 第一种方法错把整个数据集当成了当前行来计算均值,结果全是同一个值;
- 第二种方法用
c_across()精准提取当前行的目标列,再计算均值,才是正确的行均值计算方式。
内容的提问来源于stack exchange,提问作者spindoctor
相关产品推荐
相关产品推荐

