【问题标题】:dplyr mutate using dynamic variable name while respecting group_bydplyr 在尊重 group_by 的同时使用动态变量名进行变异
【发布时间】:2018-09-29 11:48:07
【问题描述】:

我正在尝试

dplyr mutate using variable columns & dplyr - mutate: use dynamic variable names

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

例如(为方便起见,我省略了循环和映射语句)

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]))

我按照参考答案的建议进行了动态分配和变量选择。但是 group_by() 不被尊重,至少对我来说,这是在这里使用 dplyr 的主要好处

想要的答案是由

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

有没有办法解决这个问题?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我实际上对pluck 了解不多,所以我不知道出了什么问题,但我会去这样做,这很有效:

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

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

    【讨论】:

    • 没问题。很抱歉,我无法确定您出了什么问题。如果我弄明白了,我会回来编辑我的答案。
    【解决方案2】:

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

    但是,另一种方法是将代码中的 pluck(iris,varname) 替换为 .data[[varname]]pluck(iris,varname) 不起作用的原因是,我想,pluck(iris,varname) 中的 iris 没有分组。但是,.data 指的是执行mutate()tibble,因此是分组的。

    as.name() 的替代品是 rlang::sym(),来自 rlang 包。

    【讨论】:

      猜你喜欢
      • 2020-08-13
      • 1970-01-01
      • 2020-07-08
      • 1970-01-01
      • 2016-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多