我有一系列文件,结构如下:
File A
chr1 Start1 End1
.
.
.
chrn Startn Endn
File B
chr1 Start1 End1
.
.
.
chrn Startn Endn
File n
chr1 Start1 End1
.
.
.
chrn Startn Endn
不同文件的长度不相同。我想要一个data_frame(或任何其他合适的解决方案),例如:
df$File_A
df$File_B
df$File_C
然后:
>print(df$File_A[1,])
>chr1 Start1 End
>print(df$File_C[n,])
>chrn Startn End
据我了解,问题在于文件长度不一样,并且我无法构建数据库。
到目前为止,我写道:
library(tidyverse)
where_are_data = "~/Desktop/proof/"
file.names <- dir(where_are_data, pattern =".bed")
data_frame_promoters <- data.frame()
for (promoter_file in 1:length(file.names))
{
a <- str_split(string = file.names[promoter_file], '_')
b <- a[[1]][1]
data_1 <- read_tsv(
paste0(where_are_data, file.names[promoter_file]),
col_names = c("Chromosome","Start","End"))
name_df_column <- paste0('data_frame_',b)
assign(name_df, data_1)
data_frame_promoters$name_df <- rbind(data_frame_promoters$name_df, data_1)
}
我收到此错误:
Error in `$<-.data.frame`(`*tmp*`, "name_df", value = list(Chromosome = c("chr12", :
replacement has 2 rows, data has 0
您对如何设置data_frame(或任何其他结构)来解决此问题有任何建议吗?
谢谢!
答案 0 :(得分:0)
假设您的所有.bed文件都是制表符分隔的格式,其中3列具有相同的数据类型,并且第一行作为列名标题,那么以下内容将满足您的需求。 lapply将使用read.table和tab sep \ t读入所有.bed文件,并指定它们的列名(由col.names设置)。字符串未设置为因素。每个单独的数据集将保存到结果列表“数据集”中。 do.call()函数调用rbind()函数,将列表中的每个元素传递给该函数。结果是一个统一的data.frame
where_are_data = "~/Desktop/proof/"
file.names <- dir(where_are_data, pattern =".bed")
datasets <- lapply(file.names,FUN=read.table,sep='\t',stringsAsFactors=F,col.names=c("Chromosome","Start","End"),header=T)
df<-do.call(rbind,datasets)