R for循环从文件中提取信息并将其添加到tibble中



我对tidyverse不太好,所以如果这是一个简单的问题,请原谅我。我有一堆文件,其中包含我需要提取的数据,并将其添加到我创建的tibble中的不同列中。

我希望行名以我设法创建的文件ID开头:

filelist <- list.fileS(pattern=".txt") # Gives me the filenames in current directory.
# The filenames are something like AA1230.report.txt for example
file_ID <- trimws(filelist, whitespace="\..*") # Gives me the ID which is before the "report.txt"
metadata <- as_tibble(file_ID[1:181]) # create dataframe with IDs as row names for 180 files.

现在,这些报告文件中有关于物种和丰度的信息(熟悉海怪的人可以使用海怪报告文件(,我只需要提取每个领域的读取次数。我可以很容易地在每个文件中搜索域和进入该域的读取次数,使用类似的东西:

sample_data <- as_tibble(read.table("AA1230.report.txt", sep="t", header=FALSE, strip.white=TRUE))
sample_data <- rename(sample_data, Percentage=V1, Num_reads_root=V2, Num_reads_taxon=V3, Rank=V4, NCBI_ID=V5, Name=V6) # Just renaming the column headers for clarity
sample_data %>% filter(Rank=="D") # D for domain

这给了我一个清晰的输出,例如:

Percentage Num_Reads_Root Num_Reads_Taxon Rank  NCBI_ID Name     
<dbl>          <int>           <int> <fct>   <int> <fct>    
1      75.9           60533              28 D           2 Bacteria 
2       0.48            386               0 D        2759 Eukaryota
3       0.01              4               0 D        2157 Archaea  
4       0.02             19               0 D       10239 Viruses  

现在,我只想在第二列和最后一列中获取信息,并将这些信息保存到我的tibble中,这样我就可以获得类似的信息:

> metadata
value     Bacteria_Counts    Eukaryota_Counts    Viruses_Counts     Archaea_Counts
<chr>     <int>              <int>               <int>               <int>
1 AA1230  60533             386                 19                   4 
2 AB0566
3 AA1231
4 AB0567
5 BC1148
6 AW0001
7 AW0002
8 BB1121
9 BC0001
10 BC0002
....with 171 more rows

我只是很难想出一个for循环来创建这些sample_data输出,然后从中提取信息并放入tibble中。我想我的第一个循环应该创建这些sample_data输出,比如:

for (files in file.list()) {
>> get_domains <<
}

然后另一个循环从上面的循环中提取信息,并将其插入到我的元数据tibble中。有什么建议吗?非常感谢!PS:如果R中的常规数据帧更好,请告诉我,我最近刚刚了解到tidyverse是组织R中数据帧的更好方法,但我必须了解更多信息。

您也可以执行以下操作:

library(tidyverse)
filelist <- list.files(pattern=".txt") 
nms <- c("Percentage", "Num_reads_root", "Num_reads_taxon", "Rank", "NCBI_ID", "Name")
set_names(filelist,filelist) %>%
map_dfr(read_table, col_names = nms, .id = 'file_ID') %>%
filter(Rank == 'D') %>%
select(file_ID, Name, Num_reads_root) %>%
pivot_wider(id_cols = file_ID, names_from = Name, values_from = Num_reads_root) %>%
mutate(file_ID = str_remove(file_ID, '.txt'))

我发现使用for循环有时很好,因为在遇到错误时可以保存所有进度。然后您可以找到问题文件并调试它,或者使用try()但抛出warning()

library(tidyverse)
filelist <- list.files(pattern=".txt") #list files
tmp_list <- list()
for (i in seq_along(filelist)) {
my_table <- read_tsv(filelist[i]) %>% # It looks like your files are all .tsv's
rename(Percentage=V1, Num_reads_root=V2, Num_reads_taxon=V3, Rank=V4, NCBI_ID=V5, Name=V6) %>%
filter(Rank=="D") %>%
mutate(file_ID <- trimws(filelist[i], whitespace="\..*")) %>%
select(file_ID, everything())
tmp_list[[i]] <- my_table
}
out <- bind_rows(tmp_list)
out

最新更新