2017-04-18 312 views
0

我已這需要起點 - 終點一個data.frame流量:矩陣元素

#od flows data.frame with trips per year as flows 
set.seed(123) 
origin <- c(rep(1,3),rep(2,3),rep(3,3)) 
destination <- c(rep(1:3,3)) 
flow <- c(runif(9, min=0, max=1000)) 
od_flows <- data.frame(origin,destination,flow) 

# od matrix with all possible origins and destinations 
od_flows_all_combos <- matrix(0,10,10) 

od_flows 
od_flows_all_combos 

> od_flows 
    origin destination  flow 
1  1   1 287.5775 
2  1   2 788.3051 
3  1   3 408.9769 
4  2   1 883.0174 
5  2   2 940.4673 
6  2   3 45.5565 
7  3   1 528.1055 
8  3   2 892.4190 
9  3   3 551.4350 
> od_flows_all_combos 
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
[1,] 0 0 0 0 0 0 0 0 0  0 
[2,] 0 0 0 0 0 0 0 0 0  0 
[3,] 0 0 0 0 0 0 0 0 0  0 
[4,] 0 0 0 0 0 0 0 0 0  0 
[5,] 0 0 0 0 0 0 0 0 0  0 
[6,] 0 0 0 0 0 0 0 0 0  0 
[7,] 0 0 0 0 0 0 0 0 0  0 
[8,] 0 0 0 0 0 0 0 0 0  0 
[9,] 0 0 0 0 0 0 0 0 0  0 
[10,] 0 0 0 0 0 0 0 0 0  0 

我想與od_flows data.frame這樣的值來更新矩陣od_flows_all_combos該起始值(在df中)等於列號(在矩陣中)和目的值(在df中)在矩陣中相等的行。例如:

更新df中所有行的od_flows_all_combos [1,1]與287.5775等等。

我想通過行「循環」data.frame od_flows,從而使用應用函數。這只是一個例子。我的實際od_flow data.frame有dim(1'200'000 x 3)和矩陣(2886x2886)。所以我需要一個有效的方法解決這個問題。

我的第一種方法是這樣的:

for(i in 1:nrow(od_flows)){ 
    od_flows_all_combos[rownames(od_flows_all_combos)==od_flows[i,2],colnames(od_flows_all_combos)==od_flows[i,1]] <- od_flows[i,3] 
    } 

計算還沒有結束......

有人能幫助我用的應用功能的解決方案?

謝謝!

回答

0

您可以組織od_flows數據幀直接矩陣,假設od_flows完全地填補your_desired_matrix

require(dplyr) 

set.seed(123) 
origin <- c(rep(1,3),rep(2,3),rep(3,3)) 
destination <- c(rep(1:3,3)) 
flow <- c(runif(9, min=0, max=1000)) 
od_flows <- data.frame(origin,destination,flow) 

od_flows_order = od_flows %>% arrange(origin, destination) 

your_desired_matrix = matrix(od_flows_order$flow, ncol = 3, byrow = TRUE) 

your_desired_matrix 

     [,1]  [,2]  [,3] 
[1,] 287.5775 788.3051 408.9769 
[2,] 883.0174 940.4673 45.5565 
[3,] 528.1055 892.4190 551.4350 
+0

或者,如果有很多零值的稀疏矩陣,而不是https://stat.ethz.ch/R -manual/R-devel/library/Matrix/html/sparseMatrix.html – zeehio

+0

我的目標是進一步使用我的od_flows_all_combos矩陣進行空間迴歸。 OD矩陣通常是稀疏矩陣,因此我需要更新od_flows_all_combos矩陣來表示我國的城市之間的流量。無論如何,Thx! – thoscha

+0

好的,找到了一個簡單的解決方案:dcast函數做我需要的一切:'dcast(od_flows,destination〜origin)' – thoscha