【问题标题】:Read multiple files but keep track of which file is which dataframe in R读取多个文件,但跟踪哪个文件是 R 中的哪个数据框
【发布时间】:2021-01-23 23:05:00
【问题描述】:

假设我有这些文件:

N1.xlsx
N2.xlsx
N3.xlsx
N4.xlsx

我希望它们在一个列表中,但每个数据帧必须根据它读取的文件命名,例如

mylist = 
N1
N2
N3
N4

我正在使用:

fnames =  mixedsort(sort(list.files("filepath", pattern = '*.xlsx', full.names = F)))

mylist <- lapply(fnames, function(x) {
 read_xlsx(paste0(x),  col_names = TRUE)
})

但是这段代码创建了一个没有标识的列表

mylist = 
[[1]]
[[2]]
[[3]]
[[4]]

在每个数据框中保留每个文件的名称很重要,这样我以后可以正确导出它们!

【问题讨论】:

    标签: r lapply


    【解决方案1】:

    有一个名为libr 的包可以满足您的要求。您可以在一行代码中完成。语法是这样的:

    libname(mylist, "<path to files>", "xlsx")
    
    

    以上代码会将数据放入变量mylist,每个数据集根据文件名命名。

    【讨论】:

      【解决方案2】:

      您可以使用您在fnames 中已有的名称来命名mylist

      names(mylist) <- tools::file_path_sans_ext(fnames)
      mylist
      

      file_path_sans_ext 从文件名中删除扩展名。

      如果您想重命名文件名中的任何内容(例如 N1 any text.xlsx),您可以使用

      names(mylist) <- tools::file_path_sans_ext(str_remove(fnames, " any  text"))
      mylist
      

      甚至:

      names(mylist) <- tools::file_path_sans_ext(str_replace(fnames, " any  text", "other text"))
      mylist
      

      【讨论】:

        【解决方案3】:

        一种策略可能是先使 fnames 不带扩展名,然后将 paste0 扩展为 lapply 中的扩展名,其优点是您可以使用 fnames 到 @987654323 @。

        fnames <- gtools::mixedsort(gsub(".xlsx", "", list.files("filepath", pattern="*.xlsx")))
        mylist <- setNames(lapply(fnames, function(x)
          openxlsx::read.xlsx(paste0("filepath/", x, ".xlsx"))), fnames)
        # $N1
        #   X1 X2 X3 X4
        # 1  1  4  7 10
        # 2  2  5  8 11
        # 3  3  6  9 12
        # 
        # $N2
        #   X1 X2 X3 X4
        # 1  1  4  7 10
        # 2  2  5  8 11
        # 3  3  6  9 12
        # 
        # $N3
        #   X1 X2 X3 X4
        # 1  1  4  7 10
        # 2  2  5  8 11
        # 3  3  6  9 12
        # 
        # $N4
        #   X1 X2 X3 X4
        # 1  1  4  7 10
        # 2  2  5  8 11
        # 3  3  6  9 12
        

        注意:我使用了openxlsx::read.xlsx,因为你没有引用你的library,这是read_xlsx 的来源,但这应该与它的工作方式相同。


        数据:

        N1 <- N2 <- N3 <- N4 <- data.frame(matrix(1:12, 3, 4))
        sapply(ls(pattern="^N"), function(p) 
          openxlsx::write.xlsx(mget(p, envir=.GlobalEnv), paste0("filepath/", p, ".xlsx")))
        

        【讨论】:

          【解决方案4】:

          也许

          如果您尝试您的代码:

          fnames =  mixedsort(sort(list.files("filepath", pattern = '*.xlsx', full.names = F)))
          
          mylist <- lapply(fnames, function(x) {
           read_xlsx(paste0(x),  col_names = TRUE)
          })
          

          后跟一个重命名列表元素的函数?

          names(mylist)<-str_remove(fnames, '.xlsx')
          

          另一种选择是将重命名步骤包含在创建列表的函数中:

          fnames =  mixedsort(sort(list.files("filepath", pattern = '*.xlsx', full.names = F)))
          
          create_list<-function(fnames){
          mylist<-lapply(fnames, function(x) {
           read_xlsx(paste0(x),  col_names = TRUE)
          })
          names(mylist)<-str_remove(fnames, '.xlsx')
          }
          
          create_list(fnames)
          

          第一个策略示例:

          mylist<-list(c(1:4), c(1:5), c('a','b'), c('d','e','f'))
          fnames<-c("N1.xlsx","N2.xlsx","N3.xlsx","N4.xlsx")
          
          names(mylist)<-str_remove(fnames, '.xlsx')
          
          > mylist
          $N1
          [1] 1 2 3 4
          
          $N2
          [1] 1 2 3 4 5
          
          $N3
          [1] "a" "b"
          
          $N4
          [1] "d" "e" "f"
          
          

          【讨论】:

          • 由于某种原因,您的代码将所有列更改为名为 N1 N2 等的列,而不是重命名数据框列表。如果你让它起作用,它可能是一个非常好的代码,因为我们可以使用 str_remove 重命名数据帧!
          • 抱歉,@GabrielG。我觉得现在可以了
          猜你喜欢
          • 1970-01-01
          • 2017-01-27
          • 1970-01-01
          • 1970-01-01
          • 2015-08-05
          • 1970-01-01
          • 1970-01-01
          • 2012-01-31
          • 2015-11-08
          相关资源
          最近更新 更多