使用dplyr函数

时间:2018-05-07 16:55:25

标签: r function dplyr

我尝试了几个小时来创建一个函数来获取有关定量变量的统计信息。

这是我的数据框的一小部分,有很多量化变量叫做tabl_profil1:

  DateDiag   Age AgeDiag
     <dbl> <dbl>   <dbl>
1    1996.   43.     21.
2    2001.   53.     36.
3    2005.   75.     62.
4    1998.   62.     42.
5    2016.   53.     51.
6    2008.   65.     55.

我想做一个函数来计算几个统计信息(平均值,中位数,最大值,最小值,置信区间),并将结果表放在一个新的数据帧中。

我尝试过不同的方式,但我总是遇到问题。

function1 <- function(VarName){results <<- tabl_profil1 %>% summarise(Mean = mean(VarName))}
function1(Age)

错误是:

Error in summarise_impl(.data, dots) : 
  Evaluation error: object 'Age' not found. 

我还尝试使用函数中的tabl_profil1 [[VarName]],但它不起作用。

希望你能帮助我,并感谢提前, 皮尔

1 个答案:

答案 0 :(得分:1)

这是non-standard evaluation。如果要像dplyr函数中那样使用裸列名称,则需要使用enquo来创建一个quosure。然后,当您调用该变量时,您需要在其名称前面加!!。试试这个:

function1 <- function(VarName){
    var <- enquo(VarName)
    results <<- tabl_profil1 %>% summarise(Mean = mean(!!var))
    }
function1(Age)

回应评论中的讨论:在这样的函数中使用<<-由于某些原因并不是一个好主意。首先,它意味着您定义的函数仅作用于特定数据框,在本例中为tabl_profil1,并仅将结果返回给特定变量,在这种情况下,通过分配回results 。这几乎违背了编写函数的目的,即灵活地重复操作。

使用这种方式的

<<-也不是那么安全,因为你最终会得到一个存储在results中的值,你可能不确切知道它来自哪里。最好能够说你调用了一个函数并将输出返回到某个变量,你可以在代码中看到你确切的位置。

此外,dplyr模型的优点是您可以对函数和管道中的数据框进行操作,并将其输出到下一个函数。你没有将数据框作为第一个参数,就会失去这一点。

构建此函数的更好方法是:

function1 <- function(df, VarName){
  var <- enquo(VarName)
  df %>% summarise(Mean = mean(!!var))
}

现在,此函数对您传递的任何数据帧进行操作,并将包含的任何变量的平均值作为第二个参数添加到该数据框。现在你可以打电话给:

mean_age <- function1(tabl_profil1, Age)
mean_height_from_other_tbl <- function1(other_table, Height)

这适用于多个数据框,并返回可以存储到所需变量的输出。显然我把第二个电话作为插图。