使用lapply和自定义函数将表直接加载到列表中

时间:2018-05-06 13:15:03

标签: r

我有一个函数读取lapply中指定的文件夹中的特定文件,并将该表加载到R.该函数如下所示:

load_files <- function(folder) {
  file <- list.files(path = paste0(folder, "/"), pattern = "quast.tsv")
  assign(
    paste0("ref_", gsub("^GCF_(.*?)_ASM(.*?)$", "\\1", folder)),
    read.delim(
      paste0(folder, "/", file),
      stringsAsFactors = F,
      header = TRUE,
      sep = "\t"
    )
  )
}

该函数为每个数据框指定一个特定名称。之前我在for循环中使用它来为每个表读取创建一个数据帧。但是,我希望它将每个数据帧加载到同一个列表中,而不将它们加载到单个数据帧中。我使用的lapply看起来像这样:

lapply(folder_names, load_files)

其中folder_names基本上只是一个字符向量,文件夹名称用另一个函数标识。

是否有任何简单的方法可以将每个指定的数据框直接加载到同一个列表中? 我尝试了以下方法,但似乎没有用:

append(df_list, lapply(folder_names, load_files))

然而,这只会与单独的lapply相同。

1 个答案:

答案 0 :(得分:2)

这就是我要做的。我的工作目录中有2个文本文件。完成后,我在列表中有2个data.frames及其对应的名称。

file_list <- list.files( pattern = "*.txt")
file_list 
[1] "movies.txt" "mtcars.txt"

df_list <- lapply(file_list,
                  FUN = function(files) {
                    read.csv(files, header = TRUE, sep = ",")
                  })

str(df_list)
List of 2
 $ :'data.frame':   2 obs. of  1 variable:
  ..$ X1..Jumanji..Adventure.Children.s.Fantasy: Factor w/ 2 levels "2::American President:The (1995)::Comedy|Drama|Romance",..: 1 2
 $ :'data.frame':   32 obs. of  1 variable:
  ..$ mpg.cyl.disp.hp.drat.wt.qsec.vs.am.gear.carb: Factor w/ 32 levels "AMC Javelin 15.2 8 304 150 3.15 3.435 17.3 0 0 3 2",..: 18 19 5 13 14 31 7 21 20 22 ...


files <- gsub(".txt", "", file_list)
files
[1] "movies" "mtcars"

names(df_list) <- files

str(df_list)
List of 2
 $ movies:'data.frame': 2 obs. of  1 variable:
  ..$ X1..Jumanji..Adventure.Children.s.Fantasy: Factor w/ 2 levels "2::American President:The (1995)::Comedy|Drama|Romance",..: 1 2
 $ mtcars:'data.frame': 32 obs. of  1 variable:
  ..$ mpg.cyl.disp.hp.drat.wt.qsec.vs.am.gear.carb: Factor w/ 32 levels "AMC Javelin 15.2 8 304 150 3.15 3.435 17.3 0 0 3 2",..: 18 19 5 13 14 31 7 21 20 22 ...