问题描述
有没有一种方法可以在R中加载一个csv文件并根据文件名自动定义变量?因此,如果您有一个名为'hello'的csv文件,我可以将其加载到R中并创建df / var。没有定义吗?
因此,而不是在加载过程中定义问候:hello = read(“ filepath / hello”);相反,我们具有read(“ filepath / hello”),但包含一个用于创建和命名与文件名相同的变量的命令(在此示例中为hello?)
解决方法
我建议您不要在任何现实情况下执行此操作,但是如果它有助于理解概念,那么这不是一个完整的解决方案,而是重要的组成部分。
<<-
封闭环境中的超级分配运算符,在以下情况下为全局名称空间:
rm(hello) # just in case,ignore warning if there is any
dont <- function(){
hello <<- 42
}
print(hello)
dont()
print(hello)
因此,您可以在函数的封闭环境中定义值,而无需返回值。
该变量的名称不必是固定的(如上例中的hello
),但可以取决于该函数的自变量,如
dontdothis <- function(name){
eval(parse(text = paste0(name," <<- 42")))
}
dontdothis("frederik")
print(frederik * 2)
您将需要添加文件操作和一些小细节,但这是可以做到的。您可能需要在R中搜索名称空间和环境以及赋值运算符,以更好地了解其中的详细信息。
同时阅读简短内容以区分全局环境和封闭环境:Why is using `<<-` frowned upon and how can I avoid it?
,根据您为什么要这样做,我会为您提供另一种解决方案:
我想您的问题是,您有一个包含大量csv文件的大文件夹,并且希望将它们全部加载并为变量指定csv文件的名称,而无需手动输入所有内容。
然后您可以运行
> setwd("C:/Users/Testuser/testfiles")
> file_names <- list.files()
> file_names
[1] "rest" "test1.txt" "test2.csv" "test3.csv"
其中的路径用作存储所有csv文件的路径。
然后,如果存储了其他文件,而您只想获取csv文件,则必须使用正则表达式对它们进行grep
> file_names_csv <- file_names[grepl(".csv",file_names)]
> file_names_csv
[1] "test2.csv" "test3.csv"
现在我们为它们加载一个for循环,并将它们分配给一个名为相应的csv文件的变量
for( name in file_names_csv){
assign(paste(name,sep=""),read.csv(file = paste(name,sep="")))
}
我们有
> test2.csv
test
1 1234
> test3.csv
test
1 2323
您还可以在加载数据之前先将.csv替换掉
> file_names_csv <- gsub(".csv","",file_names_csv )
> file_names_csv
[1] "test2" "test3"
因此,基本上,您无需使用全局变量即可完全满足您的要求。