Dplyr函数和重构列
在使用dplyr的R函数中引用和取消引用变量名时出现问题。已经通过这个网站以及哈德利的网站,它仍然得到我最好的 不起作用的功能代码是: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 :=
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