在 R 中加载 csv 文件
Load csv file in R
有没有办法在 R 中加载 csv 文件并根据文件名自动定义变量?因此,如果您有一个名为 'hello' 的 csv 文件,我可以在 R 中加载它并创建 df/var。没有定义它?
因此,不要在加载过程中定义 hello:hello=read("filepath/hello");相反,我们有 read("filepath/hello") 但包括一个命令来创建和命名一个与文件名同名的变量(在这个例子中你好?)
我建议您不要在任何现实世界场景中这样做,但如果它有助于理解概念,这不是一个完整的解决方案,而是重要的组成部分。
<<-
封闭环境中的超赋值运算符,在以下情况下是全局命名空间:
rm(hello) # just in case, ignore warning if there is any
dont <- function(){
hello <<- 42
}
print(hello)
dont()
print(hello)
因此您可以在函数内的封闭环境中定义值,而无需 return 值。
该变量的名称不必固定(如上例中的 hello
),但可以取决于该函数的参数,如
dontdothis <- function(name){
eval(parse(text = paste0(name, " <<- 42")))
}
dontdothis("frederik")
print(frederik * 2)
您将需要添加文件操作和一些小细节,但这是可以做到的。您可能希望 google 了解 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
您还可以在通过
加载数据之前 gsub .csv
> file_names_csv <- gsub(".csv","",file_names_csv )
> file_names_csv
[1] "test2" "test3"
所以基本上你没有使用全局变量就得到了你所要求的。
有没有办法在 R 中加载 csv 文件并根据文件名自动定义变量?因此,如果您有一个名为 'hello' 的 csv 文件,我可以在 R 中加载它并创建 df/var。没有定义它?
因此,不要在加载过程中定义 hello:hello=read("filepath/hello");相反,我们有 read("filepath/hello") 但包括一个命令来创建和命名一个与文件名同名的变量(在这个例子中你好?)
我建议您不要在任何现实世界场景中这样做,但如果它有助于理解概念,这不是一个完整的解决方案,而是重要的组成部分。
<<-
封闭环境中的超赋值运算符,在以下情况下是全局命名空间:
rm(hello) # just in case, ignore warning if there is any
dont <- function(){
hello <<- 42
}
print(hello)
dont()
print(hello)
因此您可以在函数内的封闭环境中定义值,而无需 return 值。
该变量的名称不必固定(如上例中的 hello
),但可以取决于该函数的参数,如
dontdothis <- function(name){
eval(parse(text = paste0(name, " <<- 42")))
}
dontdothis("frederik")
print(frederik * 2)
您将需要添加文件操作和一些小细节,但这是可以做到的。您可能希望 google 了解 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
您还可以在通过
加载数据之前 gsub .csv> file_names_csv <- gsub(".csv","",file_names_csv )
> file_names_csv
[1] "test2" "test3"
所以基本上你没有使用全局变量就得到了你所要求的。