заполнение двух векторов из функции list.files (); - PullRequest
0 голосов
/ 27 марта 2020

возможно, это наивный вопрос, я скачал несколько сборок для разных организмов со следующей структурой:

-Parent_folder
--Genus_species_1
---genome_filename_1
---genome_filename_2
---genome_filename_n
--Genus_species_2
---genome_filename_1
---genome_filename_2
---genome_filename_n
--Genus_species_N
---genome_filename_1
---genome_filename_2
---genome_filename_n

Я хотел бы сделать таблицу, в которой один столбец содержит название вида, а второй - столбец с именем файла сборки. Примерно так:

    colum1      |     column2
Genus_species_1 | genome_filename_1
Genus_species_1 | genome_filename_2
Genus_species_1 | genome_filename_n
Genus_species_2 | genome_filename_1
Genus_species_2 | genome_filename_2
Genus_species_2 | genome_filename_n
Genus_species_N | genome_filename_1
Genus_species_N | genome_filename_2
Genus_species_N | genome_filename_n

Я перепробовал много вещей, и я не знаю, что не так с этим кодом;

#listing the folders containing different number of genomes;
folder_list<- list.dirs(".", full.names = FALSE)

#Remove the parent folder;
folder_list<- folder_list[-1]

#Creating two vectors to populate with the genome filename and another with the species name(same as folder name);
genomes<-NULL
species<- NULL

#Generate a loop to populate;
for (dir in 1:length(folder_list)){
  files<- as.vector(list.files(file.path(WD, dir))) #Vector containing all the genome filenames
  genomes<- c(genomes, files) #add the one before to the genomes vector

  #next, create a vector with the number of the folder(which is the species) and repeat it as much as the number of genomes;
  directories<-rep(dir, length(list.files(file.path(WD, dir))))
  species<- append(species, directories) #add it to species vector

} #end of the loop

Надеюсь, кто-то может помочь!

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 27 марта 2020

Я воссоздал структуру каталогов, а затем создал data.frame, где в столбце 1 перечислены все дочерние каталоги, а в столбце 2 перечислены файлы в каждом дочернем каталоге.

Во-первых, вот код, написанный для репликации структуры каталогов.

# Create parent folder
dir.create("Parent_folder")

# Create child directories and files in one go
sample_dirnames <- seq_len(3)
sapply(sample_dirnames, function(index){

    # build dir path and create
    dirname <- paste0("Genus_species_", sample_dirnames[index])
    dir.create(paste0("Parent_folder/",dirname))

    # generate three files in the current directory
    sapply(seq_len(3), function(n) {
        file.create(paste0("Parent_folder/", dirname, "/genome_filename_", n, ".R"))      
    })
})

Используя функцию list.files в качестве отправной точки, используйте recursive = TRUE. Затем перенаправьте вывод в data.frame и разделите пути на каталоги и имена файлов. В этом примере используются функции из пакета dplyr и базовые функции (substring, gregexpr).

# pkg
library(tidyverse)

# build object
files <- list.files("Parent_folder/", recursive = TRUE) %>%
    as.data.frame(.) %>%
    rename(., "path" = .) %>%
    mutate(
        column1 = substring(
            text = path,
            first = 1,
            last = as.numeric(
                gregexpr(
                    pattern = "/",
                    text = path
                )[1]
            ) - 1
        ),
        column2 = substring(
            text = path,
            first = as.numeric(
                gregexpr(
                    pattern = "/",
                    text = path
                )[1]
            ) + 1
        )
    ) %>%
    select(-path)

При этом будет напечатан следующий объект

files
#          column1             column2
# 1 Genus_species_1 genome_filename_1.R
# 2 Genus_species_1 genome_filename_2.R
# 3 Genus_species_1 genome_filename_3.R
# 4 Genus_species_2 genome_filename_1.R
# 5 Genus_species_2 genome_filename_2.R
# 6 Genus_species_2 genome_filename_3.R
# 7 Genus_species_3 genome_filename_1.R
# 8 Genus_species_3 genome_filename_2.R
# 9 Genus_species_3 genome_filename_3.R
0 голосов
/ 28 марта 2020

Попробуйте, используя stringr и dplyr пакеты

library(stringr)
library(dplyr)
file_list<- list.files(".",recursive=T)
> file_list

[1] "Genus_species_1/genome_filename_1" "Genus_species_1/genome_filename_2" "Genus_species_1/genome_filename_n"
[4] "Genus_species_2/genome_filename_1" "Genus_species_2/genome_filename_2" "Genus_species_2/genome_filename_n"
[7] "Genus_species_n/genome_filename_1" "Genus_species_n/genome_filename_2" "Genus_species_n/genome_filename_n"

Используйте функцию str_split_fixed из пакета stringr, чтобы разбить переменную file_list на матрицу, а затем использовать каналы %>% из dplyr чтобы сохранить его как фрейм данных df

str_split_fixed(file_list,"/",n=2) %>% data.frame -> df 

> #rename the columns of df
colnames(df) <- c("Genus","Genome")

> df
            Genus            Genome
1 Genus_species_1 genome_filename_1
2 Genus_species_1 genome_filename_2
3 Genus_species_1 genome_filename_n
4 Genus_species_2 genome_filename_1
5 Genus_species_2 genome_filename_2
6 Genus_species_2 genome_filename_n
7 Genus_species_n genome_filename_1
8 Genus_species_n genome_filename_2
9 Genus_species_n genome_filename_n 
0 голосов
/ 27 марта 2020

Я сделал упрощенную версию вашей файловой структуры.

-Parent_Folder
--Genus_Species_1
---genome_filename1.txt
---genome_filename2.txt
---genome_filename3.txt
---genome_filename4.txt
--Genus_Species_2
---genome_filename1.txt
---genome_filename2.txt
---genome_filename3.txt

В приведенном ниже коде используется пакет here. Подробнее о пакете здесь . По сути, это облегчает построение путей (imo).

library(here)

# save the name of genus directories
GenusDirs <- list.files(here("Parent_Folder"))
GenusDirs

# initialize list to save name of genome files
GenomeFiles <- vector("list", length = length(GenusDirs))
# name elements in the list with Genus names
names(GenomeFiles) <- GenusDirs

# create list of genome files associated with each genus
for (i in 1:length(upperDir)){
  GenomeFiles[[i]] <- list.files(here("Parent_Folder", upperDir[i]))
}

# initialize vectors
GenusNames <- c()
GenomeNames <- c()

# in this loop, construct two vectors by appending Genus and Genome names
for (i in 1:length(GenomeFiles)){
  # repeat Genus Name by how many Genome files in that Genus directory
  GenusNames <- append(GenusNames, rep(names(GenomeFiles[i]), length(GenomeFiles[[i]])))

  GenomeNames <- append(GenomeNames, GenomeFiles[[i]])
}

# create data frame
GenusGenomeData <- data.frame(
  Genus = GenusNames,
  Genome = GenomeNames
)
...