我尝试了几个小时来创建一个函数来获取有关定量变量的统计信息。
这是我的数据框的一小部分,有很多量化变量叫做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]],但它不起作用。
希望你能帮助我,并感谢提前, 皮尔
答案 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)
这适用于多个数据框,并返回可以存储到所需变量的输出。显然我把第二个电话作为插图。