如何合并子文件夹中的 .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。
我在不同的条件下进行了实验。这些条件中的每一个都有自己的文件夹。在每个文件夹中,每个副本都有一个子文件夹,其中包含一个名为 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。