在R中加载CSV文件

问题描述

有没有一种方法可以在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"

因此,基本上,您无需使用全局变量即可完全满足您的要求。