我正在努力在R中创建一个函数,使用data.frame的变量名称作为其参数的一部分。
例如,我有这个数据
test.df <-
data.frame(
variable_1 = sample(letters[1:4],10, replace = T),
variable_2 = rnorm(10,10,3),
variable_3 = rnorm(10,40,15))
test.df
variable_1 variable_2 variable_3
1 c 5.514034 59.23525
2 a 10.515690 31.94552
3 d 11.845118 47.39481
4 c 8.481335 22.32198
5 d 7.945798 29.02631
6 c 9.631182 41.90519
7 c 9.348816 53.79478
8 a 4.559642 58.47290
9 d 9.876674 53.53151
10 c 12.955443 49.84759
我需要创建一个函数它访问任何给定变量的名称,例如,提取并报告它的平均值形式为'The mean is: X
'(其中'X
'包含平均值)。到目前为止,我已经试过了:
my.function <- function(df, variable) {
paste0("The mean is: ",
round(mean(df$variable),2))
}
但在我的测试中评估my.function
时。
> my.function(test.df, variable_2)
[1] "The mean of the varibale is: NA"
我的问题是:
如何在函数的参数中调用变量名?我知道有各种方法可以做到这一点,因为外面有其他库,例如使用
variable_2
或"variable_2"
,或者当需要多个变量时,要么列出没有引号的变量,只是用逗号分隔它们(variable_2, variable_3
如dplyr::select()
),或者必须将目标变量作为字符组(c("variable_2", "variable_3")
如reshape2::melt()
) 奖金当使用需要多个变量的函数时,你可以按tab,并显示可用变量列表(例如在
dplyr::select()
中)。在构建自己的函数时,如何获得此功能?
提前感谢!:)
如果我们为列名传递不加引号的参数,则使用deparse/substitute
转换为字符串,并使用[[
而不是$
。另外,创建一个条件来检查substitute
的值是否为symbol
,然后使用deparse
,以便它可以传递带引号和不带引号的
my.function <- function(df, variable) {
variable <- substitute(variable)
if(is.symbol(variable)) variable <- deparse(variable)
paste0("The mean is: ",
round(mean(df[[variable]], na.rm = TRUE),2))
}
测试
> my.function(test.df, variable_2)
[1] "The mean is: 9.86"
> my.function(test.df, "variable_2")
[1] "The mean is: 9.86"
如果我们想获得多列的平均值,使用colMeans
并将变量作为字符向量传递
my.function <- function(df, variable) {
v1 <- colMeans(df[variable], na.rm = TRUE)
sprintf("The mean of %s: %f", names(v1), v1)
}
测试
> my.function(test.df, c("variable_2", "variable_3"))
[1] "The mean of variable_2: 9.860057" "The mean of variable_3: 42.317997"
可以使用:
代替df$nameOfColumn
column <- "nameOfColumn"
df[[column]]
的例子:
my.function <- function(df, variable) {
paste0("The mean is: ",
round(mean(df[[variable]]),2))
}
> my.function(test.df, "variable_2")
[1] "The mean is: 11.88"
这可以在R语言定义索引
下找到