【问题标题】:Iterate over a subset of a vector using indices使用索引迭代向量的子集
【发布时间】:2014-02-08 00:10:46
【问题描述】:

我可以遍历目录中的所有文件。但是,我想迭代某些文件而不是所有文件。我想使用索引。

我想通过使用file_id 向量来做到这一点。每个向量元素都将是“文件”中的索引。

例如:我在一个目录中有 500 个文件,我只想迭代三个文件,即文件 2、4、15。我生成了一个名为file_id = c(2, 4, 15) 的向量。现在,我怎样才能只迭代这些文件或索引,例如files[2]files[4]files[15],它们只会从文件 2、4 和 15 中获取数据,而不是从所有 500 个文件中获取数据。

#get a list of all the files in directory.
files <- list.files(directory, full.names = TRUE) 

#iterate over all the files in directory, and get file data
for (item in files){
    filedata <- read.csv(item)
}

#What I want to do is only iterate over following files indicated in file_id vector. That will open files 2,4, and 15 nothing else.
file_id = c(2, 4, 31)

【问题讨论】:

  • files &lt;- list.files(directory, full.names = TRUE)[c(1,4,15)] 然后使用你的loop
  • 但是您应该为您感兴趣的文件做好准备,以便在list.files 中更改顺序。如果您详细解释您的问题,我们可以帮助您找到更可靠的方法。
  • 感谢吉尔伯和佩顿。它解决了我的问题。

标签: r file for-loop file-io vector


【解决方案1】:

查找所有文件,然后使用[] 运算符对它们进行索引,作为普通数组。

all.files <- list.files(directory, full.names = TRUE) 
file_id <- c(2, 4, 31)
for (item in all.files[file_id])
    {
    filedata <- read.csv(item)
    }

为了提高可读性,我倾向于避免直接索引函数调用,如 cmets 中所建议的那样。

更好的是,您应该做的是完全转储for 循环并使用*apply 函数之一。

例如

all.files <- list.files(directory, full.names = TRUE) 
file_id <- c(2, 4, 31)
filedata <- sapply(all.files[file_id], function(f)
    {
    read.csv(f)
    })

这将返回一个列表,其中每个文件都有一个元素。然后,您可以使用 [[]] 运算符访问每个文件的内容。

例如

filedata[[2]] 

将返回第二个文件的内容(即 id 为 4 的文件)

【讨论】:

    【解决方案2】:

    当您在 for 循环内进行迭代时,语法为:

    for(index in SET) 
    

    index 是您的迭代器,SET 是可以转换为向量的任何东西(即使是矩阵或数组,它也会遍历每个元素)。

    #get a list of all the files in directory.
    files <- list.files(directory, full.names = TRUE) 
    
    file_id = c(2, 4, 31)
    
    #iterate over all the files in directory, and get file data
    for (i in file_id){
        filedata <- read.csv(files[i])
    }
    

    在这里,您只需修改file_id 即可循环访问该特定文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-12
      • 2010-09-13
      • 1970-01-01
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 2020-11-27
      相关资源
      最近更新 更多