【问题标题】:R readr: Reading text files with variable metadata headersR readr:读取具有可变元数据标头的文本文件
【发布时间】:2020-07-16 03:31:49
【问题描述】:

readr 中是否有一种读取具有可变长度元数据标头的文本文件的好方法?到目前为止,我正在手动删除标题,但绝对不希望以任何方式更改我的原始数据。

我知道我可以跳过评论特定行,例如read_delim。但是,这些选项在这里不起作用。我附上了我的一个文本文件的简短示例。元数据以 /* 开头,以 */ 结尾。我想知道是否有一个选项可以跳过所有内容,直到出现 */(如 fread)?我尝试用 fread 读取我的文件,但后来遇到了不同的问题(即列名不能重复的错误消息)。不过,我想我可以用 fread 弄清楚。但我很好奇 readr 中是否有选项。

sample <- c("/* DATA DESCRIPTION:", "Citation:\tName (2015) Title", "Coverage:\tLATITUDE: 44.360000 * LONGITUDE: -26.543333", 
"Parameter(s):\tDEPTH, sediment/rock [m] (Depth) * GEOCODE", 
"\tAGE [ka BP] (Age) * GEOCODE", "\tGlobigerinella aequilateralis [%] (G. aequilateralis) * PI: Name * METHOD/DEVICE: Counting >150 µm fraction", 
"\tGlobigerina bulloides [%] (G. bulloides) * PI: Name * METHOD/DEVICE: Counting >150 µm fraction", 
"\tDeuterammina grahami [%] (D. grahami) * PI: Name * METHOD/DEVICE: Counting >150 µm fraction", 
"Size:\t8188 data points", "*/", "Depth [m]\tAge [ka BP]\tG. aequilateralis [%] (Counting >150 µm fraction)\tG. bulloides [%] (Counting >150 µm fraction)\tD. grahami [%] (Counting >150 µm fraction)", 
"0.0075\t2.23\t0.5\t23.0\t1.5", "0.0550\t3.64\t1.7\t20.8\t1.3", 
"0.0850\t4.53\t1.1\t22.3\t3.4")

 [1] "/* DATA DESCRIPTION:"                                                                                                                                              
 [2] "Citation:\tName (2015) Title"                                                                                                                                       
 [3] "Coverage:\tLATITUDE: 44.360000 * LONGITUDE: -26.543333"                                                                                                             
 [4] "Parameter(s):\tDEPTH, sediment/rock [m] (Depth) * GEOCODE"                                                                                                          
 [5] "\tAGE [ka BP] (Age) * GEOCODE"                                                                                                                                      
 [6] "\tGlobigerinella aequilateralis [%] (G. aequilateralis) * PI: Name * METHOD/DEVICE: Counting >150 µm fraction"                                                    
 [7] "\tGlobigerina bulloides [%] (G. bulloides) * PI: Name * METHOD/DEVICE: Counting >150 µm fraction"                                                                 
 [8] "\tDeuterammina grahami [%] (D. grahami) * PI: Name * METHOD/DEVICE: Counting >150 µm fraction"                                                                    
 [9] "Size:\t8188 data points"                                                                                                                                            
[10] "*/"                                                                                                                                                                
[11] "Depth [m]\tAge [ka BP]\tG. aequilateralis [%] (Counting >150 µm fraction)\tG. bulloides [%] (Counting >150 µm fraction)\tD. grahami [%] (Counting >150 µm fraction)"
[12] "0.0075\t2.23\t0.5\t23.0\t1.5"                                                                                                                                          
[13] "0.0550\t3.64\t1.7\t20.8\t1.3"                                                                                                                                          
[14] "0.0850\t4.53\t1.1\t22.3\t3.4" 

【问题讨论】:

    标签: r tidyverse readr


    【解决方案1】:

    可能有更简单的方法可以做到这一点。这是使用readtextpurrrdplyrread.table 的一种方法。代码目前适用于读取单个文本文件。

    library(readtext)
    library(dplyr)
    library(purrr)
    

    识别文件名

    file_name <- "test.txt"
    

    使用purrr包中的map_dfrreadtext将文本文件读入数据框,使用gsub删除*/和*/之间文本中的元数据,使用mutate保存剩余文本在clean_text 变量中。使用read.table阅读clean_text

    df  <- map_dfr(file_name,readtext) %>% mutate(clean_text=gsub("^.*/*...*/","",text)) %>% select(clean_text) %>%
      as.character() %>% read.table(header = TRUE, sep = ",",text=.)
    

    使用文件 test.txt 中的以下简单测试数据进行验证: /* 要跳过的元数据 */ \n col1, col2, col3, col4\n 数据 11, 数据 12, 数据 13, 数据 14\n 数据21,数据22,数据23,数据24\n

    输出如下所示:

    > df
        col1    col2    col3    col4
    1 data11  data12  data13  data14
    2 data21  data22  data23  data24
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-04
      • 2018-06-09
      • 1970-01-01
      • 2017-10-17
      • 2015-05-07
      相关资源
      最近更新 更多