Создайте большой data_frame, повторяя другие data_frames - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть ряд файлов, структурированных следующим образом:

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 (или любую другую структуру) чтобы обойти эту проблему?

Спасибо!

1 Ответ

0 голосов
/ 11 февраля 2019

Предполагая, что все ваши файлы .bed имеют разделенный табуляцией формат с ровно 3 столбцами с одинаковыми типами данных и с первой строкой в ​​виде заголовка имен столбцов, то следующее должно сделать то, что вы ищете.Lapply будет считывать все файлы .bed с помощью read.table и tab sep \ t и указывать имена их столбцов, как установлено в 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...