如何使用带省略号(点)的parse_exprs
传递多个参数无效如何使用带省略号(点)的parse_exprs,r,rlang,R,Rlang,传递多个参数无效 试过3点。。。和三刘海。但是错误 library(tidyverse) library(rlang) tf1= data.frame(y=c('price'), grp= c('stock'),x=c('time') ,stringsAsFactors = FALSE) > dat= data.frame(price=c(20,12,24,34,12,34,56,88), stock=c('fb','fb','fb','fb','
试过3点。。。和三刘海。但是错误
library(tidyverse)
library(rlang)
tf1= data.frame(y=c('price'), grp= c('stock'),x=c('time')
,stringsAsFactors = FALSE) >
dat= data.frame(price=c(20,12,24,34,12,34,56,88),
stock=c('fb','fb','fb','fb','ms','ms','ms','ms'),time=c(2,4,6,8,2,4,6,8))
my_fun2 <- function(.x, .num_var, ...){
group_var <- parse_exprs(...)
print (group_var)
num_var <- parse_expr(.num_var)
x %>%
group_by(!!!group_var) %>%
mutate(avg = mean(!!num_var), n = n(),
sd = sd(!!num_var), se = sd/sqrt(n)) %>%
distinct(!!!group_var, .keep_all = TRUE) }
my_fun2(dat, tf1$y, tf1$grp,tf1$x)
库(tidyverse)
图书馆(rlang)
tf1=data.frame(y=c('price')、grp=c('stock')、x=c('time'))
,stringsAsFactors=FALSE)>
dat=数据帧(价格=c(20,12,24,34,12,34,56,88),
股票=c('fb','fb','fb','fb','ms','ms','ms','ms'),时间=c(2,4,6,8,2,4,6,8))
我的妈妈2%
不同(!!!组变量,.keep\u all=TRUE)}
my_fun2(数据,tf1$y,tf1$grp,tf1$x)
解析表达式(…)中出错:未使用的参数(tf1$x)
如下
library(tidyverse)
library(rlang)
tf1= data.frame(y=c('price'), grp= c('stock'),x=c('time') ,stringsAsFactors = FALSE)
dat= data.frame(price=c(20,12,24,34,12,34,56,88),
stock=c('fb','fb','fb','fb','ms','ms','ms','ms'),time=c(2,4,6,8,2,4,6,8))
my_fun2 <- function(.x, .num_var, ...){
group_var <- parse_exprs(...)
print (group_var)
num_var <- parse_expr(.num_var)
x %>%
group_by(!!!group_var) %>%
mutate(avg = mean(!!num_var), n = n(),
sd = sd(!!num_var), se = sd/sqrt(n)) %>%
distinct(!!!group_var, .keep_all = TRUE)
}
my_fun2(dat, tf1$y, tf1$grp,tf1$x)
库(tidyverse)
图书馆(rlang)
tf1=data.frame(y=c('price')、grp=c('stock')、x=c('time')、stringsAsFactors=FALSE)
dat=数据帧(价格=c(20,12,24,34,12,34,56,88),
股票=c('fb','fb','fb','fb','ms','ms','ms','ms'),时间=c(2,4,6,8,2,4,6,8))
我的妈妈2%
不同(!!!组变量,.keep\u all=TRUE)
}
my_fun2(数据,tf1$y,tf1$grp,tf1$x)
实际输出是按组进行的汇总统计
解析表达式(…)中出错:未使用的参数(tf1$x)
由于传递的值是字符串,因此我们可以使用
group\u by\u at
更轻松地执行此操作。另外,确保字符串转换为符号(sym
)并在mean
,sd
中计算(!!
)
my_fun2 <- function(.x, num_var, ...){
group_var <- c(...)
.x %>%
group_by_at(vars(group_var)) %>%
mutate(avg = mean(!! rlang::sym(num_var)), n = n(),
sd = sd(!! rlang::sym(num_var)), se = sd/sqrt(n)) %>%
distinct_at(vars(group_var), .keep_all = TRUE)
}
my_fun2(dat, tf1$y, tf1$grp, tf1$x)
# A tibble: 8 x 7
# Groups: stock, time [8]
# price stock time avg n sd se
# <dbl> <fct> <dbl> <dbl> <int> <dbl> <dbl>
#1 20 fb 2 20 1 NA NA
#2 12 fb 4 12 1 NA NA
#3 24 fb 6 24 1 NA NA
#4 34 fb 8 34 1 NA NA
#5 12 ms 2 12 1 NA NA
#6 34 ms 4 34 1 NA NA
#7 56 ms 6 56 1 NA NA
#8 88 ms 8 88 1 NA NA
my_fun2%
变异(平均值=平均值(!!rlang::sym(num_var)),n=n(),
sd=sd(!!rlang::sym(num_var)),se=sd/sqrt(n))%>%
不同的(变量(组变量),.keep_all=TRUE)
}
my_fun2(数据,tf1$y,tf1$grp,tf1$x)
#一个tibble:8x7
#分组:股票、时间[8]
#股票时间平均价格
#
#1 20 fb 2 20 1 NA NA
#2 12 fb 4 12 1 NA NA
#3 24 fb 6 24 1 NA NA
#4 34 fb 8 34 1 NA NA
#5 12 ms 2 12 1 NA NA
#6 34 ms 4 34 1 NA NA
#7 56 ms 6 56 1 NA NA
#8 88 ms 8 88 1 NA NA
sd
和se
是NA
,因为每组只有一个观察值因为传递的值是字符串,我们可以通过group\u by\u at
更容易做到这一点。另外,确保字符串转换为符号(sym
)并在mean
,sd
中计算(!!
)
my_fun2 <- function(.x, num_var, ...){
group_var <- c(...)
.x %>%
group_by_at(vars(group_var)) %>%
mutate(avg = mean(!! rlang::sym(num_var)), n = n(),
sd = sd(!! rlang::sym(num_var)), se = sd/sqrt(n)) %>%
distinct_at(vars(group_var), .keep_all = TRUE)
}
my_fun2(dat, tf1$y, tf1$grp, tf1$x)
# A tibble: 8 x 7
# Groups: stock, time [8]
# price stock time avg n sd se
# <dbl> <fct> <dbl> <dbl> <int> <dbl> <dbl>
#1 20 fb 2 20 1 NA NA
#2 12 fb 4 12 1 NA NA
#3 24 fb 6 24 1 NA NA
#4 34 fb 8 34 1 NA NA
#5 12 ms 2 12 1 NA NA
#6 34 ms 4 34 1 NA NA
#7 56 ms 6 56 1 NA NA
#8 88 ms 8 88 1 NA NA
my_fun2%
变异(平均值=平均值(!!rlang::sym(num_var)),n=n(),
sd=sd(!!rlang::sym(num_var)),se=sd/sqrt(n))%>%
不同的(变量(组变量),.keep_all=TRUE)
}
my_fun2(数据,tf1$y,tf1$grp,tf1$x)
#一个tibble:8x7
#分组:股票、时间[8]
#股票时间平均价格
#
#1 20 fb 2 20 1 NA NA
#2 12 fb 4 12 1 NA NA
#3 24 fb 6 24 1 NA NA
#4 34 fb 8 34 1 NA NA
#5 12 ms 2 12 1 NA NA
#6 34 ms 4 34 1 NA NA
#7 56 ms 6 56 1 NA NA
#8 88 ms 8 88 1 NA NA
sd
和se
为NA
,因为每组只有一次观察无错误。但同一代码只打印前3列。这是完整的代码吗?。我理解你关于“NA”的观点。@kamal是的,这是完整的代码。您是否也用dplyr
加载了plyr
。在这种情况下,您可能需要明确指定dplyr::mutate
@kamal另外,我使用的dplyr'0.8.3'
已经加载了tidyverseinstalling dplyr 0.8.3并删除了plyr。非常感谢您这么快的回复。欣赏我已经检查过了,没有错。但同一代码只打印前3列。这是完整的代码吗?。我理解你关于“NA”的观点。@kamal是的,这是完整的代码。您是否也用dplyr
加载了plyr
。在这种情况下,您可能需要明确指定dplyr::mutate
@kamal另外,我使用的dplyr'0.8.3'
已经加载了tidyverseinstalling dplyr 0.8.3并删除了plyr。非常感谢您这么快的回复。欣赏我已经查过了。