我希望编写一个函数来分析多个数据集中的几个相同变量我在下面构建了该功能,但效果不佳。我不确定如何在函数中动态传递名称。有人可以帮忙吗?
有10个相同的变量(testvar1,testvar2,...,testvar10等...)15个不同的数据集中(mydata1,mydata2,... mydata15等))
library(readxl)
to_analyze <- function (data="mydata1", var = testvar1) {
#reading my file in
excelfile <- paste(`data`, "xlsx", sep = ".")
dataset_name <- read_excel(excelfile)
#populating the testvar1, testvar2,...
dataset_name$var_interest <- dataset_name$var #this does not work
#I was hoping it would give dataset_name$var_interest <- dataset_name$testvar1
#creating a smaller dataset
eco <- dataset_name %>%
select(id, var_interest) #I want var_interest to be testvar1 (not the value but the name)
##doing some analysis on that dataset
}
#creating another function for all the datasets (15 total)
fct_all <- function(x){
for(i in 1:15){
iq <- as.double(i)
dsn <- paste("mydata", deparse(iq), sep="")
to_analyze(data=dsn, var = x)
}
}
#applying the function for all the variables
all_var <- c(testvar1, testvar2, testvar3)
fct_all(all_var)```
您可以等效地使用data$var1
或data[['var1']]
。这意味着在第二种形式中,当您将变量名提供为字符串时,可以轻松地用动态变量名替换字符串:
var <- 'var1'
dataset_name$var_interest <- dataset_name[[var]]
请注意,dplyr
非常聪明,并且确实接受字符串或符号。这意味着您可以使用以下形式之一进一步简化功能:
library(dplyr)
# Using select then rename with the var given as a string
to_analyze <- function (data = "mydata1", var = "testvar1") {
eco <- paste(data, "xlsx", sep = ".") %>%
read_excel() %>%
select(id, var) %>%
rename(var_intereset = var)
...
}
为了感兴趣,您也可以使用quasiquotation,但是考虑到最终要将变量包装到向量中,我想它没什么用。会是以下形式:
library(dplyr)
to_analyze <- function (data = "mydata1", var = quo(testvar1)){
quo_var <- enquo(var)
eco <- paste(data, "xlsx", sep = ".") %>%
read_excel() %>%
select(id, !!quo_var) %>%
rename(var_intereset = !!quo_var)
...
}
此表单允许您使用原始变量名称而不是字符串来调用变量:to_analyse(data = "mydata1", var = testvar1)
。但是如前所述,可能对您而言不是最有用的。
谢谢@Romain。您的代码运行良好。我只是将单引号改为反引号
var <- `var`
to_analyze <- function (data = "mydata1", var = "testvar1") {
eco <- paste(data, "xlsx", sep = ".") %>%
read_excel() %>%
select(id, var) %>%
rename(var_intereset = var)
...
}