【发布时间】:2019-07-28 21:02:55
【问题描述】:
我有 N 个 .tsv 文件保存在我的 rstudio 工作目录中名为“data”的文件中,我想找到一种方法将它们作为单独的数据帧一次导入。下面是一个例子,当我尝试一个一个地做,但是它们太多了,我想要更快的东西。而且每次他们的总数可能不同。
#read files into R
f1<-read.table(file = 'a_CompositeSources/In1B1A_WDNdb_DrugTargetInteractions_CompositeDBs_Adhesion.tsv', sep = '\t', header = TRUE)
f2<-read.table(file = 'a_CompositeSources/In1B2A_WDNdb_DrugTargetInteractions_CompositeDBs_Cy.tsv',sep = '\t', header = TRUE)
我有 N 个 .tsv 文件保存在我的 rstudio 工作目录中名为“data”的文件中,我想找到一种方法将它们作为单独的数据帧一次导入。下面是一个例子,当我尝试一个一个地做,但是它们太多了,我想要更快的东西。而且每次他们的总数可能不同。
#read files into R
f1<-read.table(file = 'a_CompositeSources/In1B1A_WDNdb_DrugTargetInteractions_CompositeDBs_Adhesion.tsv', sep = '\t', header = TRUE)
f2<-read.table(file = 'a_CompositeSources/In1B2A_WDNdb_DrugTargetInteractions_CompositeDBs_Cytochrome.tsv', sep = '\t', header = TRUE)
基于我使用过的this answer:
library(readr)
library(dplyr)
##Read files named xyz1111.csv, xyz2222.csv, etc.
filenames <- list.files(path="C:/Users/user/Documents/kate/data",
pattern="*.tsv")
##Create list of data frame names without the ".csv" part
names <-gsub(".tsv", "", filenames)
###Load all files
for(i in names){
filepath <- file.path("C:/Users/user/Documents/kate/data",paste(i,".tsv",sep=""))
assign(i, read.delim(filepath,
colClasses=c("factor","character",rep("numeric",2)),
sep = "\t"))
}
但只读取第一个文件。
【问题讨论】:
-
考虑使用 一个 类似结构的数据帧列表,并避免用 许多 对象来繁琐地跟踪和调用您的全局环境。所以只需使用 tbl:
tbl[[1]]、tbl[[2]]、tbl[[3]]或tbl$file1.csv、tbl2$file2.csv、tbl$file3.csv -
在不了解文件的情况下可能很难回答这个问题。我可以使用人为的三重保存
mtcars.tsv来做到这一点,而您的sapply(...) %>% bind_rows()工作正常。 (顺便说一句,这是首选方法;使用带有assign的for循环通常会使事情变得比需要的困难得多。) -
@Parfait -- 我输入了相同的评论,然后意识到(在发布之前)该代码块的前 5 行几乎完全包含了这些内容。
-
对于以上评论,
.csv应该是.tsv! -
firmo23,您可能会考虑不使用常用函数作为变量名:
names和(因为您使用的是dplyr)tbl足够常用。虽然 R 通常足够聪明,可以知道您想要哪个,但不难设计出不那么清楚的情况......因此解决问题可能会变得非常困难。