【问题标题】:R script to perl?R脚本到perl?
【发布时间】:2014-07-09 16:42:50
【问题描述】:

我有一个 R 脚本,我想用它来解析一个文件并从中获取一些信息,但该文件是 44 GB。

谁能帮我用一种读取文件速度更快的编程语言写这个?

脚本很简单:

ld <- read.table("plink-inter-chr---ld-window-r2-0.ld", header = T)
ldv1 <- do.call(rbind, strsplit(as.character(ld[,1]), "_"))
ldv4 <- do.call(rbind, strsplit(as.character(ld[,4]), "_"))
ld <- matrix(c(ldv1[,2], ldv4[,2], ld[,2], ld[,5], ld[,7]), ncol=5)
N <- 30
within <- numeric(N)
between <- numeric(N)
for(i in 1:N){
within[i] <- mean(as.numeric(ld[which(ld[,1] == i & ld[,2] == i),5]))
between[i] <- mean(as.numeric(ld[which(ld[,1] == i & ld[,2] != i),5]))
}
table <- matrix(c(within, between), ncol=2)
write.table(table, file = "within-between.tab", quote = FALSE, row.names = FALSE, col.names = FALSE)

文件看起来像这样:

 CHR_A         BP_A SNP_A  CHR_B         BP_B SNP_B           R2           DP
NODE_1_length_193190_coverage_19.3759_GC_24.97          919    . NODE_1_length_193190_coverage_19.3759_GC_24.97         2210    .            1            1
NODE_1_length_193190_coverage_19.3759_GC_24.97          919    . NODE_1_length_193190_coverage_19.3759_GC_24.97         2419    .            1            1
NODE_1_length_193190_coverage_19.3759_GC_24.97          919    . NODE_1_length_193190_coverage_19.3759_GC_24.97         2524    .            1            1
NODE_1_length_193190_coverage_19.3759_GC_24.97          919    . NODE_1_length_193190_coverage_19.3759_GC_24.97         2587    .            1            1
NODE_1_length_193190_coverage_19.3759_GC_24.97          919    . NODE_1_length_193190_coverage_19.3759_GC_24.97         2799    .            1            1
NODE_1_length_193190_coverage_19.3759_GC_24.97          919    . NODE_1_length_193190_coverage_19.3759_GC_24.97         2947    .            1            1
NODE_1_length_193190_coverage_19.3759_GC_24.97          919    . NODE_1_length_193190_coverage_19.3759_GC_24.97         3142    .            1            1
NODE_1_length_193190_coverage_19.3759_GC_24.97          919    . NODE_1_length_193190_coverage_19.3759_GC_24.97         3178    .            1            1
NODE_1_length_193190_coverage_19.3759_GC_24.97          919    . NODE_1_length_193190_coverage_19.3759_GC_24.97         3261    .            1            1

感谢您的帮助, 阿德里安

【问题讨论】:

  • 对于那些不熟悉R的人,你能举个例子说明输出应该是什么样子吗?
  • @AdrianP:你的“谁能帮我用一种读取文件速度更快的编程语言写这个”是什么意思?你懂什么语言,你需要什么帮助?我想这与你的工作有关,你利用别人的努力并获得报酬是非常错误的
  • mysite.science.uottawa.ca/ncorradi/members.html 我正在攻读科学硕士学位。攻读硕士学位确实获得了助学金,但这不是传统意义上的就业。我懂一点perl和python。

标签: r perl ld


【解决方案1】:

在 R 代码中,您浪费时间并变慢(因此可能会加快速度)的一些地方包括:

您正在读取字符串,将它们转换为因子,然后将它们转换回字符串。查看read.tablestringsAsFactors 参数,了解如何避免这两种转换。

当您使用它时,您可以通过在read.table 中指定colClasses 来获得一些速度,这样该函数就不需要浪费时间猜测每一列应该是什么。

在进行字符串拆分后,rbind 将所有内容组合在一起,但随后仅使用每个结果矩阵中的 1 列。在第一个“”之后获取数字(或非“”的序列)可能会更快,您可以使用 gsubfn 包中的 strapply 函数或仅使用 regexpr 和 @ 987654328@函数。

使用cbind 函数创建ld 矩阵可能比使用matrix 连接然后重新包装要快。实际上,为什么首先创建矩阵,您不使用其中的 2 列,而其他列单独使用。这也会将您的数字转换为稍后需要转换回来的字符。

在循环中运行as.numeric 效率低下,您会一遍又一遍地转换相同的值,只需在循环之前对整个矩阵执行一个as.numeric

您不需要对which 的调用,因为下标在which 处理的逻辑上可以正常工作。

修复上述问题,看看这会加快结果的速度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 2014-09-30
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    相关资源
    最近更新 更多