R: Как читать данные, разделенные табуляцией, игнорируя нечетные символы?

#r #fread

#r #fread

Вопрос:

У меня есть загрузка файлов в подкаталогах с одинаковым форматом, которые я хотел бы импортировать и объединить с idcolumn, принадлежащим к тому каталогу имя файла, из которого они пришли:

 (bed 12)
(          x           y            z            u            v            w     diameter            t    mass-flow         mass    frequency         time         name)
(( 3.3109e 00   1.9791e 00   9.8968e-01   3.8232e-03  -2.3234e-03  -4.7283e-03   4.2372e-07   3.0000e 02   1.9023e-13   3.9759e-17   4.7844e 03   3.5049e 01) injection-0:426)
(( 3.2420e 00   1.9782e 00   9.3270e-01  -1.5477e-04   4.0080e-04  -2.3946e-04   9.0324e-07   3.0000e 02   1.2563e-12   3.8514e-16   3.2620e 03   3.2168e 02) injection-0:1147)
(( 3.1500e 00   1.9731e 00   8.5654e-01  -1.7934e-04   1.0918e-03  -8.8252e-04   2.1000e-06   3.0000e 02   9.4751e-12   4.8406e-15   1.9574e 03   1.6171e 02) injection-0:2943)
 

Теоретически это не слишком сложно, и vroom — мой выбор, но он не может угадать разделитель и импортирует три столбца, один из которых — все числа в виде одного большого символьного вектора:

 files<-list.files("*.dpm",recursive=TRUE)
df<-vroom::vroom(files,id="path", skip=1)%>%janitor::clean_names()
 
  1. Я думаю, что могу записать третий столбец на диск, а затем перечитать его, используя read.table , но это ошибка.
  2. Разделите третий столбец, используя stringr::str_split() , но тоже не идеально.
  3. Используется awk для удаления всех (и ) из всех файлов. В любом случае, я думаю, мне все равно придется задать вопрос о стеке для этого метода.

Какие-нибудь мысли, пожалуйста?

Редактировать:

Следующий код, похоже, работает:

 df <-data.table::rbindlist(
  sapply(files, data.table::fread, skip=1, fill=TRUE, simplify = FALSE),
  use.names = TRUE, idcol = "FileName")
 

но я предпочитаю однострочник врума. Любые другие решения?

Комментарии:

1. Прошу прощения, если я неправильно понял ваш вопрос (и, конечно, у меня нет данных для воспроизведения проблемы), но можете ли вы передать vroom delim = "t" аргумент, чтобы заставить его читать как разделенный табуляцией, вместо того, чтобы угадывать разделитель?

2. К сожалению, это приводит к сбою R. Я видел это с vroom, когда он пытается открыть слишком много файлов.

3. Хм, еще одна мысль была бы оберткой read_tsv , но это не сильно отличается от data.table варианта. Не уверен, что есть какой-то другой выбор, по крайней мере, насколько мне известно. df <- bind_rows(lapply(files, function(x) cbind(read_tsv(x, skip = 1), id = x)))