【问题标题】:Fast concatenation of thousands of files by columns按列快速连接数千个文件
【发布时间】:2016-12-14 14:57:37
【问题描述】:

我正在使用 R 来 cbind 大约 11000 个文件,使用:

dat <- do.call('bind_cols',lapply(lfiles,read.delim))

这是令人难以置信的缓慢。我使用 R 是因为我的下游处理(如创建绘图等)在 R 中。按列连接数千个文件有哪些快速替代方法?

我想要完成这三种类型的文件。它们看起来像这样:

[centos@ip data]$ head C021_0011_001786_tumor_RNASeq.abundance.tsv
target_id   length  eff_length  est_counts  tpm
ENST00000619216.1   68  26.6432 10.9074 5.69241
ENST00000473358.1   712 525.473 0   0
ENST00000469289.1   535 348.721 0   0
ENST00000607096.1   138 15.8599 0   0
ENST00000417324.1   1187    1000.44 0.0673096   0.000935515
ENST00000461467.1   590 403.565 3.22654 0.11117
ENST00000335137.3   918 731.448 0   0
ENST00000466430.5   2748    2561.44 162.535 0.882322
ENST00000495576.1   1319    1132.44 0   0

[centos@ip data]$ head C021_0011_001786_tumor_RNASeq.rsem.genes.norm_counts.hugo.tab
gene_id C021_0011_001786_tumor_RNASeq
TSPAN6  1979.7185
TNMD    1.321
DPM1    1878.8831
SCYL3   452.0372
C1orf112    203.6125
FGR 494.049
CFH 509.8964
FUCA2   1821.6096
GCLC    1557.4431

[centos@ip data]$ head CPBT_0009_1_tumor_RNASeq.rsem.genes.norm_counts.tab
gene_id CPBT_0009_1_tumor_RNASeq
ENSG00000000003.14  2005.0934
ENSG00000000005.5   5.0934
ENSG00000000419.12  1100.1698
ENSG00000000457.13  2376.9100
ENSG00000000460.16  1536.5025
ENSG00000000938.12  443.1239
ENSG00000000971.15  1186.5365
ENSG00000001036.13  1091.6808
ENSG00000001084.10  1602.7165

谢谢!

【问题讨论】:

  • 尝试分析您的代码。我敢打赌read.delim 是你的瓶颈。请改用data.table::fread。还有谷歌关于将数据集快速读取到 R
  • 尝试使用 fread 从 data.table 即 lapply(lfiles, fread) 阅读,而不是有很多列,最好 rbind 使用分组变量,即 rbindlist(lapply(lfiles, fread), idcol=TRUE)(尽管帖子包含很少的信息来提供任何类型的解决方案)
  • 您是在寻找cbind 还是rbind? rbindlist from data.table 非常快
  • @Chris 正在尝试列绑定 - cbind.

标签: r cbind


【解决方案1】:

为了快速读取文件,我们可以使用fread 和data.table,然后使用rbind 和data.table 的list,使用rbindlist 指定idcol=TRUE 来提供一个分组变量来识别每个数据集

library(data.table)
DT <- rbindlist(lapply(lfiles, fread), idcol=TRUE)

【讨论】:

    【解决方案2】:

    如果你有所有的数值数据,你可以先转换成矩阵,这比数据帧要快很多:

    > microbenchmark(
    do.call(cbind, rep(list(sleep), 1000)),
    do.call(cbind, rep(list(as.matrix(sleep)), 1000))
    )
    Unit: microseconds
                                                  expr      min       lq       mean
                do.call(cbind, rep(list(sleep), 1000)) 6978.635 7496.690 8038.21531
     do.call(cbind, rep(list(as.matrix(sleep)), 1000))  636.282  722.814  862.01125
       median        uq       max neval
     7864.180 8397.8595 12213.473   100
      744.647  793.0695  7416.430   100
    

    或者,如果你想要一个数据框,你可以使用unlist作弊,然后手动设置类:

    df <- unlist(rep(list(sleep), 1000), recursive=FALSE)
    class(df) <- 'data.frame'
    

    【讨论】:

      猜你喜欢
      • 2013-01-12
      • 2021-09-01
      • 1970-01-01
      • 2011-08-19
      • 1970-01-01
      • 2013-05-13
      • 2015-12-03
      • 2017-03-14
      • 1970-01-01
      相关资源
      最近更新 更多