【发布时间】:2013-11-01 18:18:27
【问题描述】:
我正在使用 206 行 x 196 列的矩阵 set_onco,我有一个向量 genes_100(它是一个矩阵,但我只取第一个列),有 101 个名称。
这是他们的外观的sn-p
> set_onco[1:10,1:10]
V2 V3 V4 V5 V6 V7 V8 V9 V10 V11
GLI1_UP.V1_DN COPZ1 C10orf46 C20orf118 TMEM181 CCNL2 YIPF1 GTDC1 OPN3 RSAD2 SLC22A1
GLI1_UP.V1_UP IGFBP6 HLA-DQB1 CCND2 PTH1R TXNDC12 M6PR PPT2 STAU1 IGJ TMOD3
E2F1_UP.V1_DN TGFB1I1 CXCL5 POU5F1 SAMD10 KLF2 STAT6 ENTPD6 VCAN HMGCS1 ANXA8
E2F1_UP.V1_UP RRP1B HES1 ADCY6 CHAF1B VPS37B GRSF1 TLX2 SSX2IP DNA2 CMA1
EGFR_UP.V1_DN NPY1R PDZK1 GFRA1 GREB1 MSMB DLC1 MYB SLC6A14 IFI44 IFI44L
EGFR_UP.V1_UP FGG GBP1 TNFRSF11B FGB GJA1 DUSP6 S100A9 ADM ITGB6 DUSP4
ERB2_UP.V1_DN NPY1R PDZK1 ANXA3 GREB1 HSPB8 DLC1 NRIP1 FHL2 EGR3 IFI44
FAM18B1
ERB2_UP.V1_UP CYP1A1 CEACAM5 FAM129A TNFRSF11B DUSP4 CYP1B1 UPK2 DAB2 CEACAM6 KIAA1199
GCNP_SHH_UP_EARLY.V1_DN SRRM2 KIAA1217 DEFA1 DLK1 PITX2 CCL2 UPK3B SEZ6 TAF15 EMP1
genes_100[1:10,1]
[1] AL591845.1 B3GALT6 RAP1GAP HSPG2 BX293535.1 RP1-159A19.1 IFI6 FAM76A FAM176B CSF3R
101 Levels: 5_8S_rRNA AC018470.1 AC091179.2 AC103702.3 AC138972.1 ACVR1B AL049829.5 AL137797.2 AL139260.2 AL450326.2 AL591845.1 AL607122.2 B3GALT6 BX293535.1 ... ZNF678
我要做的是解析矩阵并计算每行包含genes_100中的名称的频率
为此,我创建了 3 个 for 循环:第一个同时向下移动一行,第二个移入该行,第三个循环遍历列表 genes_100 检查匹配项。
最后,我将genes_100 与每行中的术语匹配的次数保存在矩阵中,同时保存矩阵中的行名(以便我知道哪个是哪个)
代码可以正常工作并给我正确的输出...但它真的很慢!!
输出的一个sn-p是:
head(result_matrix_100)
freq_100
[1,] "GLI1_UP.V1_DN" "0"
[2,] "GLI1_UP.V1_UP" "0"
[3,] "E2F1_UP.V1_DN" "0"
[4,] "E2F1_UP.V1_UP" "0"
[5,] "EGFR_UP.V1_DN" "0"
[6,] "EGFR_UP.V1_UP" "0"
我使用了system.time(),我得到了:
user system elapsed
525.38 0.06 530.34
这太慢了,因为我要解析更大的矩阵,在某些情况下我必须重复这 10k 次!!!
代码是:
result_matrix_100 <- matrix(nrow=0, ncol=2)
for (q in seq(1,nrow(set_onco),1)) {
for (j in seq(1, length(set_onco[q,]),1)) {
for (x in seq(1,101,1)) {
if (as.character(genes_100[x,1]) == as.character(set_onco[q,j])) {
freq_100 <- freq_100+1
}
}
}
result_matrix_100 <- rbind(result_matrix_100, cbind(row.names(set_onco)[q], freq_100))
}
你有什么建议?
提前感谢:)
【问题讨论】:
-
你能发布样本数据和结果吗?
-
听起来像应用程序 plyr 可能有用吗?
-
当然,天真的方法的第一步是简单地在您的矩阵上调用
table...?而++freq_100看起来根本不像 R 代码。 -
@David,我刚刚从数据和结果中添加了 sn-ps,谢谢
-
@joran,对不起,我纠正了
++freq_100的错误。您能否详细说明table的建议?
标签: r performance for-loop