代码之家  ›  专栏  ›  技术社区  ›  Chuck P

Dplyr函数和重构列

  •  1
  • Chuck P  · 技术社区  · 7 年前

    在使用dplyr的R函数中引用和取消引用变量名时出现问题。已经浏览过这个网站和哈德利的 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)
    

    它会返回我想要的,除了 已成为 foo 如何在这行代码中找到正确的名称 mutate(!!iv1 := factor(!!iv1)) %>% 现在我得到一个 Error: LHS must be a name or string 尽管有各种各样的组合,我还是想不出有什么好赌的。

    提前谢谢。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Sastibe    7 年前

    此处的教程部分描述了您的情况: 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 
    

    希望有帮助!

        2
  •  0
  •   Chuck P    7 年前

    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
    
    推荐文章