我在不同条件下进行了实验。每个条件都有其自己的文件夹。在每个文件夹中,每个副本都有一个子文件夹,其中包含一个名为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文件,其中只有数字作为列标题,而不是我想要的名称。这是创建的文件的摘录,其中我已标记了应包含上述标题的行(C1.1,C1.2,C1.2等):
是否有可能如上所述命名列?
答案 0 :(得分:0)
也许我误会了,但为什么不这么做
# 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
说明:我们只需绑定data.frame
中所有listData
的单个列,并用setNames
设置列名。
我不明白您为什么先做bind_rows
,然后又从长到宽重铸。只需使用一个bind_cols
就可以实现同样的目的。
答案 1 :(得分:0)
在这种情况下,该行:
names(listData) <- gsub("DistList.txt","",basename(fileList))
必须替换为
names(listData) <- basename(dirname(fileList))
以便子文件夹的名称用作单列的标题。