合并多个文件时如何添加带有文件名的附加列?
How to add an additional column with the filenames when merging many files?
我正在合并几个文件(超过 5000 个)来做一些分析。下面的脚本将合并所有这些文件,但是,我后来不知道哪个是原始文件。我想做的是添加一个带有文件名的附加列。 Row names = TRUE 仅添加数字,但我想要确切的名称。
setwd("/path")
library(data.table)
temp2 = list.files(path= "path", pattern="*.txt")
myfiles2 = lapply(temp2, function(x)read.table(x, header=T, sep="\t", comment.char="#",na.strings=".",stringsAsFactors=FALSE,quote="",fill=FALSE))
merged_dataset <- data.table::rbindlist(myfiles2,fill=TRUE)
write.table(merged_dataset, file="merged_dataset.txt", sep="\t", quote=FALSE, row.names=FALSE)
我现在的输出:
chr pos ref alt...
1 1902906 T G...
1 1904677 A C...
2 1976878 C G...
3 1908790 C T...
1 1904566 T A...
2 1966789 T G...
我想要什么:
chr pos ref alt... phenotype
1 1902906 T G... filename.txt
1 1904677 A C... filename.txt
2 1976878 C G... filename.txt
3 1908790 C T... filename.txt
1 1904566 T A... filename2.txt
2 1966789 T G... filename2.txt
我没试过,但我想试试
myfiles2 = lapply(temp2, function(x){a<- read.table(x, header=T, sep="\t", comment.char="#",na.strings=".",stringsAsFactors=FALSE,quote="",fill=FALSE); a$phenotype <- x})
这个有效:
myfiles2 = lapply(temp2, function(x) data.frame(read.table(x, header=T, sep="\t", comment.char="#",na.strings=".",stringsAsFactors=FALSE,quote="",fill=FALSE), phenotype = x))
使用 tidyverse
library(dplyr)
library(readr)
library(purrr)
map_dfr(temp2, ~ read_tsv(.x, comment = '#', na = ".", quote = "") %>%
mutate(phenotype = .x))
既然您已经在使用data.table
,我建议您使用fread()
来阅读..
如果您使用已收集的文件名命名结果列表,则可以在最终 table 中使用这些名称,使用 data.table::rbindlist()
-函数
的 idcol
-参数]
library(data.table)
myfiles2 = lapply( temp2, data.table::fread, fill = TRUE) #optional improvement
names(myfiles2) <- basename(temp2)
data.table::rbindlist(myfiles2, use.names = TRUE, fill = TRUE, idcol = "phenotype")
我正在合并几个文件(超过 5000 个)来做一些分析。下面的脚本将合并所有这些文件,但是,我后来不知道哪个是原始文件。我想做的是添加一个带有文件名的附加列。 Row names = TRUE 仅添加数字,但我想要确切的名称。
setwd("/path")
library(data.table)
temp2 = list.files(path= "path", pattern="*.txt")
myfiles2 = lapply(temp2, function(x)read.table(x, header=T, sep="\t", comment.char="#",na.strings=".",stringsAsFactors=FALSE,quote="",fill=FALSE))
merged_dataset <- data.table::rbindlist(myfiles2,fill=TRUE)
write.table(merged_dataset, file="merged_dataset.txt", sep="\t", quote=FALSE, row.names=FALSE)
我现在的输出:
chr pos ref alt...
1 1902906 T G...
1 1904677 A C...
2 1976878 C G...
3 1908790 C T...
1 1904566 T A...
2 1966789 T G...
我想要什么:
chr pos ref alt... phenotype
1 1902906 T G... filename.txt
1 1904677 A C... filename.txt
2 1976878 C G... filename.txt
3 1908790 C T... filename.txt
1 1904566 T A... filename2.txt
2 1966789 T G... filename2.txt
我没试过,但我想试试
myfiles2 = lapply(temp2, function(x){a<- read.table(x, header=T, sep="\t", comment.char="#",na.strings=".",stringsAsFactors=FALSE,quote="",fill=FALSE); a$phenotype <- x})
这个有效:
myfiles2 = lapply(temp2, function(x) data.frame(read.table(x, header=T, sep="\t", comment.char="#",na.strings=".",stringsAsFactors=FALSE,quote="",fill=FALSE), phenotype = x))
使用 tidyverse
library(dplyr)
library(readr)
library(purrr)
map_dfr(temp2, ~ read_tsv(.x, comment = '#', na = ".", quote = "") %>%
mutate(phenotype = .x))
既然您已经在使用data.table
,我建议您使用fread()
来阅读..
如果您使用已收集的文件名命名结果列表,则可以在最终 table 中使用这些名称,使用 data.table::rbindlist()
-函数
idcol
-参数]
library(data.table)
myfiles2 = lapply( temp2, data.table::fread, fill = TRUE) #optional improvement
names(myfiles2) <- basename(temp2)
data.table::rbindlist(myfiles2, use.names = TRUE, fill = TRUE, idcol = "phenotype")