【问题标题】:Dplyr a function and refactoring a columnDplyr 一个函数并重构一个列
【发布时间】:2018-02-07 21:54:16
【问题描述】:

在使用 dplyr 的 R 函数中引用和取消引用变量名时遇到问题。浏览过这个网站以及 Hadley 的 Programming with dplyr 网站,它仍然让我受益匪浅。

不起作用的功能码是:

gcreatedata <- function(dataframe,depvar,iv1,iv2){
  depvar <- enquo(depvar)
  iv1 <- enquo(iv1)
  iv2 <- enquo(iv2)
  newdata <- dataframe %>%
    mutate(!!iv1 := factor(!!iv1)) %>%
    group_by(!!iv1, !!iv2)  %>%
    summarise(TheMean = mean(!!depvar,na.rm=TRUE),
          TheSD = sd(!!depvar,na.rm=TRUE),
          TheSEM = sd(!!depvar,na.rm=TRUE)/sqrt(length(!!depvar)),
          CI95Muliplier = qt(.95/2 + .5, length(!!depvar)-1))
return(as_tibble(newdata))
}

mtcars 调用它会是

sss <- gcreatedata(mtcars,mpg,am,cyl)

我只是想将变量am 转换为在ggplot 中下游使用的因子。是的,我知道我可以在输入函数之前做到这一点,但我希望它是通用的。该功能可以在减去因子步骤后正常工作,如果您运行此版本,您可以看到。

gcreatedata <- function(dataframe,depvar,iv1,iv2){
  depvar <- enquo(depvar)
  iv1 <- enquo(iv1)
  iv2 <- enquo(iv2)
  newdata <- dataframe %>%
    mutate(foo := factor(!!iv1)) %>%
    group_by(foo, !!iv2)  %>%
    summarise(TheMean = mean(!!depvar,na.rm=TRUE),
          TheSD = sd(!!depvar,na.rm=TRUE),
          TheSEM = sd(!!depvar,na.rm=TRUE)/sqrt(length(!!depvar)),
          CI95Muliplier = qt(.95/2 + .5, length(!!depvar)-1))
  return(as_tibble(newdata))
}
sss <- gcreatedata(mtcars,mpg,am,cyl)

它返回我想要的,除了 am 已变为 foo 我如何在这行代码中获得正确的名称 mutate(!!iv1 := factor(!!iv1)) %&gt;% 现在我收到一条 Error: LHS must be a name or string 消息,尽管如此我想不出骰子的组合方式。

提前致谢。

【问题讨论】:

    标签: r function dplyr


    【解决方案1】:

    这里的教程部分描述了您的情况:http://dplyr.tidyverse.org/articles/programming.html#different-input-and-output-variable

    以下代码适用于我:

    > library(dplyr)
    > 
    > gcreatedata <- function(dataframe,depvar,iv1,iv2){
    +   depvar <- enquo(depvar)
    +   iv1_q <- enquo(iv1)
    +   iv2 <- enquo(iv2)
    +   
    +   iv1_name <- paste0("mean_", quo_name(iv1_q))
    +   
    +   newdata <- dataframe %>%
    +     mutate(!!iv1_name := factor(!!iv1_q)) %>%
    +     group_by(!!iv1_q, !!iv2)  %>%
    +     summarise(TheMean = mean(!!depvar,na.rm=TRUE),
    +               TheSD = sd(!!depvar,na.rm=TRUE),
    +               TheSEM = sd(!!depvar,na.rm=TRUE)/sqrt(length(!!depvar)),
    +               CI95Muliplier = qt(.95/2 + .5, length(!!depvar)-1))
    +   return(as_tibble(newdata))
    + }
    > sss <- gcreatedata(mtcars,mpg,am,cyl)
    > sss
    # A tibble: 6 x 6
    # Groups:   am [?]
         am   cyl TheMean TheSD TheSEM CI95Muliplier
      <dbl> <dbl>   <dbl> <dbl>  <dbl>         <dbl>
    1  0     4.00    22.9 1.45   0.839          4.30
    2  0     6.00    19.1 1.63   0.816          3.18
    3  0     8.00    15.0 2.77   0.801          2.20
    4  1.00  4.00    28.1 4.48   1.59           2.36
    5  1.00  6.00    20.6 0.751  0.433          4.30
    6  1.00  8.00    15.4 0.566  0.400         12.7 
    

    希望有帮助!

    【讨论】:

    • 谢谢@sastibe 是的,我看到了,但希望避免不得不创建一个新的列名变量而不得不将其重新插入现有的列名。谢谢,但如果我找不到更清洁的解决方案,我一定会记住。查克
    【解决方案2】:

    24 小时让我头脑清醒。如果其他人将来需要它,这就是答案...

    gcreatedata <- function(dataframe,depvar,iv1,iv2){
      depvar <- enquo(depvar)
      iv1 <- enquo(iv1)
      iv2 <- enquo(iv2)
      newdata <- dataframe %>%
        mutate(!!quo_name(iv1) := factor(!!iv1), !!quo_name(iv2) := factor(!!iv2)) %>%
        group_by(!!iv1, !!iv2)  %>%
        summarise(TheMean = mean(!!depvar,na.rm=TRUE),
                  TheSD = sd(!!depvar,na.rm=TRUE),
                  TheSEM = sd(!!depvar,na.rm=TRUE)/sqrt(length(!!depvar)),
                  CI95Muliplier = qt(.95/2 + .5, length(!!depvar)-1))
      return(as_tibble(newdata))
    }
    

    在常用数据上对其进行测试...

    gcreatedata(mtcars,mpg,am,vs)
    # A tibble: 4 x 6
    # Groups:   am [?]
      am    vs    TheMean TheSD TheSEM CI95Muliplier
      <fct> <fct>   <dbl> <dbl>  <dbl>         <dbl>
    1 0     0        15.0  2.77  0.801          2.20
    2 0     1        20.7  2.47  0.934          2.45
    3 1     0        19.8  4.01  1.64           2.57
    4 1     1        28.4  4.76  1.80           2.45
    

    【讨论】:

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