【问题标题】:update matrix element by looping through a data.frame通过遍历 data.frame 更新矩阵元素
【发布时间】:2017-09-14 16:05:56
【问题描述】:

我有一个包含起点-终点流的 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 有暗淡(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]
  }

计算尚未结束...

有人可以帮助我使用应用功能解决问题吗?

谢谢!

【问题讨论】:

    标签: r matrix apply


    【解决方案1】:

    假设od_flows 完全填充your_desired_matrix,您可以直接将 od_flows 数据帧组织为矩阵

    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
    

    【讨论】:

    • 或者如果有很多零值,则使用稀疏矩阵代替stat.ethz.ch/R-manual/R-devel/library/Matrix/html/…
    • 我的目标是进一步使用我的 od_flows_all_combos 矩阵进行空间回归。 OD 矩阵通常是稀疏矩阵,因此我需要更新代表我国城市之间流量的 od_flows_all_combos 矩阵。无论如何谢谢!
    • 好的,找到了一个简单的解决方案:dcast-function 可以满足我的所有需求:dcast(od_flows,destination~origin)
    猜你喜欢
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 2022-01-06
    相关资源
    最近更新 更多