Dplyr函数和重构列

Dplyr函数和重构列,r,function,dplyr,R,Function,Dplyr,在使用dplyr的R函数中引用和取消引用变量名时出现问题。已经通过这个网站以及哈德利的网站,它仍然得到我最好的 不起作用的功能代码是: gcreatedata <- function(dataframe,depvar,iv1,iv2){ depvar <- enquo(depvar) iv1 <- enquo(iv1) iv2 <- enquo(iv2) newdata <- dataframe %>% mutate(!!iv1 :=

在使用dplyr的R函数中引用和取消引用变量名时出现问题。已经通过这个网站以及哈德利的网站,它仍然得到我最好的

不起作用的功能代码是:

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))
}
我只是想把变量
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)

gcreatedata这里的教程部分描述了您的情况:

以下代码适用于我:

> 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 
>库(dplyr)
> 

>gcreatedata24小时让我头脑更清醒。如果将来有人需要它,这里有一个答案

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 thanking@sastibe是的,我看到了,但我希望避免不得不创建一个新的列名变量,只需将它重新添加到现有的列名中。谢谢,不过如果我找不到更干净的解决方案,我一定会记住的。扔出
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