Как использовать подстановочные знаки для определения col_type при использовании readr?

Я только что спросил несколько дней назад, как установить определенный тип столбца при использовании пакета readr. большие целые числа при чтении файла с помощью readr в r

Есть ли способ определить имена столбцов с помощью подстановочного знака? В моем случае у меня иногда есть несколько столбцов, начинающихся с Intensity, и приложение в зависимости от эксперимента. Трудно использовать read_tsv в функции, если вы заранее не знаете, какие имена проектов используются.

Так что что-то вроде col_types = cols('Intensity.*' = col_double()) было бы здорово.

Кто-нибудь знает, как получить эту функцию?

EDIT: Может быть, что-то вроде чтения первых двух строк, grep "Интенсивность" в names, а затем каким-то образом создать этот параметр, например cols(Intensity=col_double(), 'Intensity pg'=col_double(), 'Intensity hs'=col_double()). Но я понятия не имею, как создать это значение параметра на лету.


person drmariod    schedule 23.08.2016    source источник
comment
Может быть, вы можете построить что-то на txt <- "foo,bar1,bar2\n1,2,3";matches <- grep("^bar\\d+", strsplit(readLines(textConnection(txt), n=1),",",T)[[1]], value=T);read_csv(txt, col_types=setNames(rep(list(col_character()), length(matches)), matches)).   -  person lukeA    schedule 23.08.2016
comment
Спасибо, это работает. Я не знал, что могу просто предоставить список col_types. Идеальный. Не могли бы вы написать ответ, чтобы я мог отдать должное?!   -  person drmariod    schedule 23.08.2016
comment
Вы можете установить .default, если вы завернете спецификации в cols, что может быть полезно, в зависимости от того, сколько столбцов того или иного типа у вас есть.   -  person alistaire    schedule 24.08.2016
comment
Это довольно смешано от целого числа до текста. Так что .default вряд ли поможет.   -  person drmariod    schedule 24.08.2016


Ответы (1)


Я добавляю ответ, который решил мой вопрос, на основе комментария lukeA...

read_MQtsv <- function(file) {
  require('readr')
  jnk <- read.delim(file, nrows=1, check.names=FALSE)
  matches <- grep('Intensity|LFQ|iBAQ', names(jnk), value=TRUE)
  read_tsv(file, 
           col_types=setNames(
             rep(list(col_double()), length(matches)), 
             matches))
}

Поэтому я адаптировал единственную строку из комментария к новой функции, которую буду использовать при чтении своих специальных файлов, созданных программой под названием MaxQuant.

person drmariod    schedule 24.08.2016