【问题标题】:Multiple import of tsv files works only for the first filetsv 文件的多次导入仅适用于第一个文件
【发布时间】: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"))
    }

但只读取第一个文件。

【问题讨论】:

  • 考虑使用 一个 类似结构的数据帧列表,并避免用 许多 对象来繁琐地跟踪和调用您的全局环境。所以只需使用 tbltbl[[1]]tbl[[2]]tbl[[3]]tbl$file1.csvtbl2$file2.csvtbl$file3.csv
  • 在不了解文件的情况下可能很难回答这个问题。我可以使用人为的三重保存 mtcars.tsv 来做到这一点,而您的 sapply(...) %&gt;% bind_rows() 工作正常。 (顺便说一句,这是首选方法;使用带有assignfor 循环通常会使事情变得比需要的困难得多。)
  • @Parfait -- 我输入了相同的评论,然后意识到(在发布之前)该代码块的前 5 行几乎完全包含了这些内容。
  • 对于以上评论,.csv 应该是.tsv
  • firmo23,您可能会考虑不使用常用函数作为变量名:names 和(因为您使用的是dplyrtbl 足够常用。虽然 R 通常足够聪明,可以知道您想要哪个,但不难设计出不那么清楚的情况......因此解决问题可能会变得非常困难。

标签: r import


【解决方案1】:

这里是您的问题的解决方案

# empty list
data = list()

###Load all files 
for(i in names){ 
filepath <- file.path("C:/Users/user/Documents/kate/data",paste(i,".tsv",sep="")) 
data[i] = read.delim(filepath, colClasses=c("factor","character",rep("numeric",2)), sep = "\t")
 }

【讨论】:

    【解决方案2】:

    你可以用map()试试这个:

    files <- list.files(path="C:/Users/user/Documents/kate/data",
                        pattern="*.tsv") %>% 
     as_tibble() %>% 
     mutate(
        data = map(value, ~ read.delim(glue::glue("C:/Users/user/Documents/kate/data/{.x}"), colClasses=c("factor","character",rep("numeric",2)), sep = "\t"))
      )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-22
      • 1970-01-01
      • 2020-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-24
      相关资源
      最近更新 更多