dplyr使用动态变量名变异,同时尊重group_by

时间:2018-04-19 05:16:24

标签: r dplyr

我正按照

进行尝试

dplyr mutate using variable columns &安培; dplyr - mutate: use dynamic variable names

在mutate中使用动态名称。我想要做的是按照最小标准偏差的组对列数据进行标准化。每列具有不同的最小标准偏差

e.g。 (为方便起见,我省略了循环和地图语句)

require(dplyr)
require(magrittr)
data(iris)
iris <- tbl_df(iris)

minsd <- c('Sepal.Length' = 0.8)
varname <- 'Sepal.Length'

iris %>% group_by(Species) %>% mutate(!!varname := mean(pluck(iris,varname),na.rm=T)/max(sd(pluck(iris,varname)),minsd[varname]))

我得到了动态分配&amp;变量选择按参考答案的建议工作。但是group_by()不受尊重,至少对我而言,这是使用dplyr的主要好处

希望的答案由

提供
iris %>% group_by(Species) %>% mutate(!!varname := mean(Sepal.Length,na.rm=T)/max(sd(Sepal.Length),minsd[varname]))

有解决方法吗?

2 个答案:

答案 0 :(得分:3)

我实际上对pluck一点都不太了解,所以我不知道出了什么问题,但我会这样做,这有用:

iris %>% group_by(Species) %>% 
  mutate(
    !! varname :=
      mean(!!as.name(varname), na.rm = T) / 
      max(sd(!!as.name(varname)),
          minsd[varname])
 )

如果这不是您想要的,请告诉我。

答案 1 :(得分:1)

另一个答案显然是最好的,它也解决了我遇到的类似问题。例如,对于!!as.name(),不需要使用group_by_()(或group_by_atarrange_()(或arrange_at())。

但是,另一种方法是用pluck(iris,varname)替换代码中的.data[[varname]]。我想pluck(iris,varname)不起作用的原因是,iris中的pluck(iris,varname)未分组。但是,.data是指执行tibble的{​​{1}},因此被分组。

mutate()包中的as.name()rlang::sym()的替代方法。