#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()
- Я думаю, что могу записать третий столбец на диск, а затем перечитать его, используя
read.table
, но это ошибка. - Разделите третий столбец, используя
stringr::str_split()
, но тоже не идеально. - Используется
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)))