从.csv文件到R函数的参数不起作用。
尝试以下功能。但是出现如下错误消息。
> tf1= data.frame(y=c('price'),grp= c('stock'))
>
> dat= data.frame(price=c(20,12,24,34,12,34,56,88),
+ stock=c('fb','fb','fb','fb','ms','ms','ms','ms'))
>
> my_fun2 <- function(x, num_var, ...) {
+ group_var <- enquos(...)
+ num_var <- enquo(num_var)
+
+ x %>%
+ group_by(!!!group_var) %>%
+ mutate(avg = mean(!!num_var), n = n(),
+ sd = sd(!!num_var), se = sd/sqrt(n))}
>
> dat %>% my_fun2(tf1$y,tf1$grp)
price stock `tf1$grp` avg n sd se
<dbl> <fct> <fct> <dbl> <int> <dbl> <dbl>
1 20 fb stock NA 8 NA NA
2 12 fb stock NA 8 NA NA
3 24 fb stock NA 8 NA NA
4 34 fb stock NA 8 NA NA
5 12 ms stock NA 8 NA NA
6 34 ms stock NA 8 NA NA
7 56 ms stock NA 8 NA NA
8 88 ms stock NA 8 NA NA
警告消息:
1:在mean.default(〜tf1 $ y)中:参数不是数字或逻辑: 返回NA 2:在var(if(is.vector(x)|| is.factor(x))x else中 as.double(x),na.rm = na.rm):在因子x上调用var(x)是 不推荐使用,将成为错误。使用类似 'all(duplicated(x)[-1L])'测试一个常数向量。
答案 0 :(得分:0)
几个问题:
第一个问题是数据帧tf1的定义,因为当前设置是传递因子而不是实际字符串。需要在该行中添加stringsAsFactors = FALSE
。
第二次更正,现在tf1中的值是包含引号的字符串,因此您不需要enquo
函数,而需要parse_expr
函数。现在,这应该可以正常工作。
library(rlang)
library(dplyr)
tf1= data.frame(y=c('price'), grp= c('stock'), 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'))
my_fun2 <- function(x, num_var, group_var){
group_var <- parse_expr(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))
}
my_fun2(dat, tf1$y, tf1$grp)
# A tibble: 8 x 6
# Groups: stock [2]
price stock avg n sd se
<dbl> <fct> <dbl> <int> <dbl> <dbl>
1 20 fb 22.5 4 9.15 4.57
2 12 fb 22.5 4 9.15 4.57
3 24 fb 22.5 4 9.15 4.57
4 34 fb 22.5 4 9.15 4.57
5 12 ms 47.5 4 32.4 16.2
6 34 ms 47.5 4 32.4 16.2
7 56 ms 47.5 4 32.4 16.2
8 88 ms 47.5 4 32.4 16.2
传递多个分组变量 为了接受多个分组变量的一种选择是传递列名的向量。这确实与您最初使用...参数的方法不同。传递名称向量确实可以大大简化代码。
dat= data.frame(price=c(20,12,24,34,12,34,56,88),
stock=c('fb','fb','fb','fb','ms','ms','ms','ms'),
day=c("A", "B", "A", "B", "A", "B", "A", "B"))
#passing multiple items to the function
my_fun2 <- function(x, num_var, group_var){
group_var <- parse_exprs(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))
}
grouping<- c('stock', 'day')
y <- c('price')
my_fun2(dat, y, grouping)