Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何避免此数据集中的for循环?_R - Fatal编程技术网

如何避免此数据集中的for循环?

如何避免此数据集中的for循环?,r,R,R中的For循环非常慢,但我不知道如何实现以下目标 如本截图所示: 我希望输出格式如下所示: > gene_id tss_id x y 其中,x=isosub$q1\u FPKM/iso.agg$q1\u FPKM//(对应基因id) 这是我的代码,带有for循环: length = length(isosub$gene_id) tmp = data.frame(isosub$gene_id, isosub$q1_FPKM, isosub$q2_FPKM) j = 1 denominat

R中的For循环非常慢,但我不知道如何实现以下目标

如本截图所示:

我希望输出格式如下所示:

> gene_id tss_id x y
其中,
x=isosub$q1\u FPKM/iso.agg$q1\u FPKM//(对应基因id)

这是我的代码,带有
for
循环:

length = length(isosub$gene_id)
tmp = data.frame(isosub$gene_id, isosub$q1_FPKM, isosub$q2_FPKM)
j = 1
denominator_q1 = iso.agg$q1_FPKM[j]
denominator_q2 = iso.agg$q2_FPKM[j]

gene_id = isosub$gene_id
tmpq1 = tmp$isosub.q1_FPKM
tmpq2 = tmp$isosub.q2_FPKM
isoq1 = iso.agg$q1_FPKM
isoq2 = iso.agg$q2_FPKM
o2_q1 = rep(0, length)
o2_q2 = rep(0, length)

i = 0

for (i in 1:length){
     if (gene_id[i+1] == gene_id[i]){
          o2_q1[i] = tmpq1[i] / denominator_q1
          o2_q2[i] = tmpq2[i] / denominator_q2
     }else{
          o2_q1[i] = tmpq1[i] / denominator_q1
          o2_q2[i] = tmpq2[i] / denominator_q2
          j = j + 1
          denominator_q1 = isoq1[j]
          denominator_q2 = isoq2[j]
     }
}
length=1000
时,
system.time
显示:

>    user  system elapsed 
>   55.74    0.00   56.45

我的实际长度甚至更大:13751。

要合并吗

outdf <- merge(isosub[c("gene_id", "tss_id", "q1_FPKM", "q2_FPKM")],
               iso.agg[c("gene_id", "q1_FPKM", "q2_FPKM")],
               by="gene_id",
               suffix=c(".1", ".2"))
outdf$x <- outdf$q1_FPKM.1 / outdf$q1_FPKM.2
outdf$y <- outdf$q2_FPKM.1 / outdf$q2_FPKM.2

outdf如果您在这里寻找避免或加速循环的方法,请查看以下答案:


它帮助我解决了一个类似的问题,并展示了保持必要循环但显著提高性能的方法

合并
然后
聚合
outdf <- merge(isosub[c("gene_id", "tss_id", "q1_FPKM", "q2_FPKM")],
               iso.agg[c("gene_id", "q1_FPKM", "q2_FPKM")],
               by="gene_id",
               suffix=c(".1", ".2"))
outdf$x <- outdf$q1_FPKM.1 / outdf$q1_FPKM.2
outdf$y <- outdf$q2_FPKM.1 / outdf$q2_FPKM.2