R readr: чтение текстовых файлов с переменными заголовками метаданных - PullRequest
0 голосов
/ 04 апреля 2020

Есть ли хороший способ в readr читать текстовые файлы с заголовками метаданных переменной длины? Пока я вручную удаляю заголовок, но определенно предпочел бы не изменять мои необработанные данные каким-либо образом.

Я знаю, что могу пропустить и комментарий указать c строк, например, 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" 

1 Ответ

0 голосов
/ 04 апреля 2020

Там может быть более простой способ сделать это. Вот один подход с использованием readtext, purrr, dplyr и read.table. Код работает для чтения одного текстового файла на данный момент.

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

Определить имя файла

file_name <- "test.txt"

использовать map_dfr из purrr пакет и readtext для чтения текстовых файлов в кадре данных, используйте 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 data11, data12, data13, data14 \ n data21, data22, data23, data24 \ n

Вывод выглядит так:

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