从CSV文件到R函数的参数不起作用

时间:2019-08-12 21:24:25

标签: r dplyr

从.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])'测试一个常数向量。

1 个答案:

答案 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)