功能阅读许多csv

时间:2016-03-24 01:17:20

标签: r

我创建了一个允许将csv分配给变量的函数。然而,它不起作用,我不知道为什么。这是代码:

 file_id <- readline("Type a common word for your files: ")
 file_list <- list.files(pattern = file_id)

 multi.csv <- function(pattern.seq)
  {
    for(i in 1:length(pattern.seq))
       {
          assign(pattern.seq[i], read.csv(pattern.seq[i]))
       }
  }

multi.csv(pattern.seq = file_list)

cat(" Now your .csv files are stored in variables: ", file_list) 

让我解释一下这里发生了什么。让我们假设我有十个csv。只在名称中有一定数量的文件,例如。 file_01,file_02 ...函数list.files重新识别文件名中的模式并将其存储在char矢量c中(&#34; file_02&#34;,&#34; file_02&#34; ...)。然后我编写了函数multi.csv,它应该分配存储在csv中的数据。变成变量。然而,它不起作用。更重要的是,当我使用file_list vector的某个元素调用multi.csv函数外的assign函数时:

assign(file_list[1], read.csv(file_list[1]))

它可以正常工作:变量file_01存储来自file_01.csv的数据。

您是否知道为什么它不能在multi.csv函数内工作?

我完全清楚读取许多csv文件的整个问题可以用不同的方式解决,但我想知道这里有什么问题。

2 个答案:

答案 0 :(得分:1)

此处的问题与范围有关。

在R中,每个变量都存储在一个环境中。

  • 存在一个存储“顶级”变量的全局环境。这有时称为工作空间或工作空间环境。
  • 有包环境(实际上每包两个:一个是公共的,一个是私有的)。
  • 您可以使用new.env()创建自定义环境。
  • 您可以将数据。框架,列表和现有save()文件复制到attach()的新环境中,但不鼓励这样做。
  • 有一些相当模糊且通常不重要的环境,例如空白环境和Autoload环境。
  • 最后,为每个功能评估创建一个新环境,对于该特定功能的特定评估,该环境称为评估环境

assign()上的文档在准确地传递哪个环境接收到要分配的变量时有点分散,但我会尝试引用所有相关的通道:

  

pos 在哪里完成作业。默认情况下,分配到当前环境中。有关其他可能性,请参阅“详细信息”。

  

envir 要使用的environment。请参阅“详细信息”。

  

pos 参数可以用以下几种方式指定分配对象的环境:as -1(默认值),作为正整数({{3}中的位置) } list);作为搜索列表中元素的字符串名称;或者作为search(包括使用environment访问当前活动的函数调用)。 envir 参数是指定环境的另一种方法,但主要用于反向兼容。

  

请注意,对附加列表或数据框的分配会更改附加副本而不是原始对象:请参阅sys.frameattach

  

如果未指定 envir ,则分配将在当前活动的环境中进行。

  

如果 inherits 为TRUE,则会搜索所提供环境的封闭环境,直到遇到变量 x 。然后在遇到变量的环境中分配该值(假设绑定未锁定:请参阅with:如果是,则发出错误信号)。如果未遇到符号,则在用户的工作空间(全局环境)中进行分配。

     

如果 inherits 为FALSE,则赋值发生在 envir 的初始框架中,除非现有绑定被锁定或者没有现有绑定且环境被锁定(当发出错误信号时)。

由于您未在pos调用中指定任何envirinheritsassign()个参数,因此该变量最终会被分配到“当前”又名“活跃”的环境。由于assign()调用是在对multi.csv()函数的调用内发生的,因此“当前”又称“活动”环境是对multi.csv()函数进行特定评估的评估环境。当multi.csv()的评估完成时,环境被破坏,变量被破坏(注意:关闭评估环境可以防止它被破坏,但是你的代码没有进行任何关闭,所以不会在这里申请。)

这也有助于解释为什么对assign()的顶级调用有效:因为在这种情况下,“当前”又称“活动”环境是全局环境,因此变量正好位于您期望的位置:在您的工作区环境中。

您可以在pos=1L来电中传递envir=globalenv()assign()来解决问题。

(您也可以通过传递inherits=T来解决问题,这类似于使用超级对齐运算符lockBinding,但不鼓励这样做。)

有关详细信息,请参阅<<-

答案 1 :(得分:0)

抱歉,为什么你需要任何模式?您是不是只需遍历文件夹中的所有文件并将内容合并到一个数据集中?尝试下面的脚本,看看它是否能满足您的需求。

setwd("C:/Users/xxx/")

file_list <- list.files()

file_list <- list.files("C:/Users/xxx/")

for (file in file_list){

  # if the merged dataset doesn't exist, create it
  if (!exists("dataset")){
    dataset <- read.table(file, header=TRUE, sep="\t")
  }

  # if the merged dataset does exist, append to it
  if (exists("dataset")){
    temp_dataset <-read.table(file, header=TRUE, sep="\t")
    dataset<-rbind(dataset, temp_dataset)
    rm(temp_dataset)
  }

}