r - 用于将代码应用于不同文件的循环
问题描述
我希望你们一切都好。初学者在这里。
我有这段代码来获取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
有人可以解释这个错误并帮助构建循环的其余部分吗?非常感谢。
解决方案
你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)
}