为for循环中的文件列表添加一个包含文件名的新列

bvhaajcl  于 2023-02-06  发布在  其他
关注(0)|答案(1)|浏览(136)

我有一个时间序列数据。我存储在txt文件下的数据每日子文件夹每月文件夹。

setwd(".../2018/Jan")
parent.folder <-".../2018/Jan"  
sub.folders <- list.dirs(parent.folder, recursive=TRUE)[-1] #To read the sub-folders under parent folder
r.scripts <- file.path(sub.folders)
A_2018 <- list()
for (j in seq_along(r.scripts)) {
  A_2018[[j]] <- dir(r.scripts[j],"\\.txt$")}

在这些.txt文件中,我使用以下代码删除了一些不想用于进一步分析的文件。

trim_to_two <- function(x) {
  runs = rle(gsub("^L1_\\d{4}_\\d{4}_","",x))
  return(cumsum(runs$lengths)[which(runs$lengths > 2)] * -1)
}

A_2018_new <- list()
for (j in seq_along(A_2018)) {
  A_2018_new[[j]] <- A_2018[[j]][trim_to_two(A_2018[[j]])]
  }

然后,我想通过for循环对整个.txt文件进行rowbind。在此之前,我想删除每个txt文件中的一些行,并添加一个新的列(带有文件名)。以下是我的代码。

for (i in 1:length(A_2018_new)) {
  
  for (j in 1:length(A_2018_new[[i]])){
       
    filename <- paste(str_sub(A_2018_new[[i]][j], 1, 14))
        
    assign(filename, read_tsv(complete_file_name, skip = 14, col_names = FALSE), 
           )
    
    Y <- r.scripts %>% str_sub(46, 49)
    MD <- r.scripts %>% str_sub(58, 61)
    HM <- filename %>% str_sub(9, 12)
    Turn <- filename %>% str_sub(14, 14)
    time_minute <- paste(Y, MD, HM, sep="-")
    
    Map(cbind, filename, SampleID = names(filename))
    }
}

但是我没有得到我想要的输出。我试着用其他的例子编码。有人能帮助解释我的代码缺少了什么吗?

34gzjxbg

34gzjxbg1#

你的代码看起来过于复杂了。但是你的问题并不是100%清楚的(例如,你的文件名中决定导入什么和不导入什么的模式是什么?)。这里有一些可以大大简化代码的指针,很可能避免你遇到的问题。
使用lapply()purrr包中的map()代替for循环进行迭代。好处是它将不同的 Dataframe 放在一个列表中,您不需要将多个 Dataframe 分配到环境中它们自己的对象中。由于您标记了tidyverse,因此我们将使用purrr函数。

library(tidyverse)

例如,您可以检索txt文件路径,使用类似于

txt_files <- list.files(path = 'data/folder/', pattern = "txt$", full.names = TRUE) # Need to remove those files you don't with whatever logic applies

然后将map()与来自readrread_tsv()一起使用,如下所示:

mydata <- map(txt_files, read_tsv)

然后,您可以再次使用lapply()map()对每个数据框应用操作。最简单的方法是创建自定义函数,然后将其应用于每个数据框:

my_func <- function(df, filename) {
  df |>
    filter(...) |> # Whatever logic applies here
    mutate(filename = filename)
}

然后使用map2()应用此函数,迭代数据和文件名,然后使用list_rbind()跨行绑定 Dataframe 。

mydata_output <- map2(mydata, txt_files, my_func) |>
  list_rbind()

相关问题