如何在r中调用或访问函数中的数据框架变量



我正在努力在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_3dplyr::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语言定义索引

下找到

相关内容

  • 没有找到相关文章

最新更新