首页 > 解决方案 > 用于将代码应用于不同文件的循环

问题描述

我希望你们一切都好。初学者在这里。

我有这段代码来获取excel文件的行数和列的平均值。

data <- read.table("filename.xls",sep = "\t", header = T)

mean <- mean(data$Perim.)

ncells <- nrow(data)

df <- data.frame (mean,ncells)

write.table(df, file = "data.csv")`

我想找到一种为文件夹中的所有 excel 文件运行该代码的方法,因此我创建了一个我希望将代码应用于的 excel 文件列表:

file.list <- list.files(pattern='*.xls')

但我什至无法通过这部分循环:

for(i in 1:length(file.list)){
  data[i] = read.table("file.list[[i]]",sep = "\t", header = T)
} 

我收到以下错误:

Error in file(file, "rt") : cannot open the connection
In addition: Warning message:
In file(file, "rt") :
  cannot open file 'file.list[i]': No such file or directory

有人可以解释这个错误并帮助构建循环的其余部分吗?非常感谢。

标签: rloops

解决方案


file.list是一个向量,而不是一个列表。所以你应该用单括号来引用它的元素:file.list[i].

然后创建一个列表项来存储结果会很有帮助。请注意在mylist存储新列表元素时在列表项上使用双括号。

mylist <- list()

for(i in 1:length(file.list)){
  mydata <- read.table("file.list[i]",sep = "\t", header = T)
  mean <- mean(mydata$Perim.)
  ncells <- nrow(mydata)
  mydata2 <- data.frame(Col1Label = mean, Col2Label = ncells)
  mylist[[i]] <- mydata2
} 

names(mylist) <- file.list

然后要访问给定的结果,您可以键入:

mylist[[listnumber]]

或者

mylist[["nameofelment"]]

如果您愿意,可以使用rbindlist()data.table 包中的数据折叠到 data.table 中。这是非常有效的,如果您首先通过知道要解析多少个文件来指定列表的大小,则更是如此。

您还可以执行以下操作,首先创建一个数据框,然后使用循环将单行绑定到每次迭代的数据框。就性能而言,这远非最佳,但如果您只有 100 个或 1000 个文件要通读,那就没问题了。

mydataframe <- data.frame()

for(i in 1:length(file.list)){
  mydata <- read.table("file.list[i]",sep = "\t", header = T)
  mean <- mean(mydata$Perim.)
  ncells <- nrow(mydata)
  mydataset <- file.list[i]
  mydata2 <- data.frame(Col1Label = mean, Col2Label = ncells, Dataset = mydataset)
  mydataframe <- rbind(mydataframe,mydata2)
} 

推荐阅读