如何合并子文件夹中的 .txt 文件并以与使用 R 的主文件夹相同的方式命名它们?

How to merge .txt files in subfolders and name them after in the same way as the main folder using R?

我在不同的条件下进行了实验。这些条件中的每一个都有自己的文件夹。在每个文件夹中,每个副本都有一个子文件夹,其中包含一个名为 DistList.txt 的文本文件。这看起来像这样,其中文件夹 "C1.1"、"C1.2" 等包含提到的 .txt 文件:

那些.txt文件看起来是这样的,但它们的长度可能只有一两个到几百个不等:

现在,我想合并这些 .txt 文件并从中创建一个 .csv 文件,如下所示:

C1.1  C1.2  C1.3  ...
155   223   996
169   559   999
259   623   1033
2003        2220
4421

到现在为止,我能够编写一个脚本,将所有文件放在一起,并将单个数据绘制在不同的列中,就像我想要的那样。但是,我希望每一列的标题是我提取 .txt 文件的主文件夹的名称(例如 C1.1、C1.2、C1.3、C2.1,...)。

到目前为止,我有这个脚本:

fileList <- list.files(path = ".", recursive = TRUE, pattern = "DistList.txt", full.names = TRUE)

listData <- lapply(fileList, read.table)

names(listData) <- gsub("DistList.txt","",basename(fileList))

library(tidyverse)
library(reshape2)

bind_rows(listData, .id = "FileName") %>%
  group_by(FileName) %>%
  mutate(rowNum = row_number()) %>%
  dcast(rowNum~FileName, value.var = "V1") %>%
  select(-rowNum) %>%
  write.csv(file="Result.csv")

这会生成一个像这样的 .csv 文件,其中 headers 列只有数字,而不是我想要的名称。这是所创建文件的摘录,我在其中标记了应包含上述标题的行(C1.1、C1.2、C1.2、...):

是否可以像我上面提到的那样命名列?

也许我理解错了,但为什么不这样做呢

# Generate some sample data consisting of a list
# of single-column data.frame's
set.seed(2017);
listData <- list(
    C1 = data.frame(V1 = runif(10)),
    C2 = data.frame(V1 = runif(10)),
    C3 = data.frame(V1 = runif(10)))

setNames(bind_cols(listData), names(listData))
#           C1          C2         C3
#1  0.92424261 0.674331481 0.63411352
#2  0.53717641 0.002020766 0.37986744
#3  0.46919565 0.025093514 0.94207403
#4  0.28862618 0.432077786 0.75499369
#5  0.77008816 0.499391912 0.22761184
#6  0.77276871 0.388681932 0.91466603
#7  0.03932234 0.395375316 0.62044504
#8  0.43490560 0.715707325 0.31910458
#9  0.47216639 0.940999879 0.07628881
#10 0.27383312 0.827229161 0.26083932

说明:我们简单绑定listData中所有data.frame的单列,并设置列名为setNames.

我不明白你为什么要先做一个bind_rows,然后再从长到宽重铸。使用单个 bind_cols.

也可以实现同样的效果

在这种情况下,行:

names(listData) <- gsub("DistList.txt","",basename(fileList))    

必须替换为

names(listData) <- basename(dirname(fileList))

以便子文件夹的名称用作单列的 headers。