2016-02-08 67 views
-4

我有三個數據幀A,B和C.更快的方式來運行循環在r

A有18000行和18000列,B有150000行和5列。

我想用B填充A的元素。

這個循環需要很長時間。我怎樣才能更快地運行這個循環? B的

Entrez_Gene_Id 2324 34345 4345 1234 3453 
1 Entrez_Gene_Id 0  0 0 0 0 
2   23040 0  0 0 0 0 
3   7249 0  0 0 0 0 
4   64478 0  0 0 0 0 
5   4928 0  0 0 0 0 
6   58191 0  0 0 0 0 

例如

例如

head(B) 
    V1 Gene1 Gene2  weight newWeight 
1 1 4171 4172 2.01676494 0.020420929 
2 2 2237 5111 1.933298567 0.015300857 
3 4 506 509 2.439170425 0.020577243 
4 7 6635 6636 2.255316779 0.081088975 
5 8 6133 6210 3.427969232 0.021132906 
6 10 23521 6217 1.607247743 0.027792961 

,這是我的代碼:

B<- data.frame(lapply(C, as.character), stringsAsFactors=FALSE) 

for(i in 1:nrow(B)){ 
    Rname=B[i,2] 
    Cname=B[i,3] 
    A[Rname,Cname]=B[i,5] 
    print(i) 
} 
+1

可以告訴你什麼在'A'和'B' – mtoto

+2

不要使用循環。 R中的許多操作都是向量化的。 – Heroka

+1

嘗試'A [cbind(B [,2],B [,3])] < - B [,5]' –

回答

1

它好像你正試圖填補一個完整的矩陣稀疏表示法的矩陣。您可以使用dgCMatrix類從Matrix包來完成:

library(Matrix) 
b_mat <- sparseMatrix(i=B[,2],j=B[,3],x=B[,5]) 

這使得稀疏格式矩陣。要轉換至18000 X 18000形式:

as.data.frame(as.matrix(b_mat)) 

編輯:我會建議離開as.data.frame呼叫在這裏,作爲matrix會更容易考慮列數工作,你有

+0

有趣的軟件包。你可以和'base R'方法做一個時間比較嗎? –

+0

@PierreLafortune使用稀疏矩陣時,它不會比包Matrix更高效。 – Roland

+0

@PierreLafortune矩陣是一個'推薦'包,預計將與每個R安裝一起出現。 –