使用索引迭代向量的子集

时间:2014-01-18 16:20:11

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

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

我想通过使用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)

2 个答案:

答案 0 :(得分:4)

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来循环播放特定文件。

答案 1 :(得分:2)

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

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)
    }

为了提高可读性,我倾向于避免直接索引函数调用,如注释中所示。

更好的是,你应该做的是完全转储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的文件)