【问题标题】:How to use wildcards to define col_type when using readr?使用readr时如何使用通配符定义col_type?
【发布时间】:2016-08-23 11:25:45
【问题描述】:

前几天刚问过,使用readr包的时候如何设置具体的列类型。 big integers when reading file with readr in r

有没有办法通过通配符定义列名?就我而言,有时我有几个以Intensity 开头的列和一个取决于实验的附录。如果您事先不知道使用了哪些项目名称,则很难在函数中使用read_tsv

所以像col_types = cols('Intensity.*' = col_double()) 这样的东西会很棒。

有人知道如何获得此功能吗?

编辑: 也许像阅读前两行,names 中的grep 'Intensity',然后以某种方式创建这个参数,如cols(Intensity=col_double(), 'Intensity pg'=col_double(), 'Intensity hs'=col_double())。 但我不知道如何动态创建这个参数值。

【问题讨论】:

  • 也许你可以建立在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))之上。
  • 谢谢,这行得通。我不知道我可以向col_types 提供一个列表。完美的。你会写一个答案,所以我可以给予信任?!
  • 如果您将规范包装在cols 中,您可以设置.default,这可能很有用,具体取决于您拥有的类型的列数。
  • 从整数到文本非常混合。所以我猜.default 不会有太大帮助。

标签: r wildcard readr


【解决方案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 的程序生成的特殊文件时,我将使用该函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    相关资源
    最近更新 更多