【问题标题】:How to create an origin-destination matrix from two vectors (in R or Stata)如何从两个向量(在 R 或 Stata 中)创建起点-终点矩阵
【发布时间】:2016-03-04 15:17:43
【问题描述】:

我有一个个人通勤数据集,如下所示:

id    Origin Destination
 1         1           3   
 2         1           4   
 3         2           1
 4         2           3 
 5         2           1
 6         3           4

其中“id”是个人,“origin”和“destinations”是城市。

我想构造一个起点-终点矩阵,比如:

        City1 City2 City3 City4
  City1     0     0     1     1
  City2     2     0     1     0
  City3     0     0     0     1

有人知道如何在 R 或 Stata 中执行此操作吗?

另外:

我可能需要按来源城市的人口对流量进行加权。示例:

id    Origin Destination OriginPop
 1         1           3         5
 2         1           4         5
 3         2           1        10
 4         2           3        10
 5         2           1        10
 6         3           4         7

其中“OriginPop”是原籍城市的总人口。

然后我想要一个加权的起点-终点矩阵,例如:

        City1 City2 City3 City4
  City1     0     0   1/5   1/5
  City2  2/10     0  1/10     0
  City3     0     0     0   1/7

【问题讨论】:

  • 第一点尝试table(df$Origin,df$Destination) df 是数据集的data.frame
  • @Tensibai,我稍后会尝试,如果有效,请告诉您。谢谢!
  • @Tensibai,效果很好!再次感谢!

标签: r matrix stata flow


【解决方案1】:

我只是想为您问题的第二部分添加一个答案,并在@Tensibai 已经建议的内容中添加一些内容 这是您的数据:

cities<-data.frame(id=c(1:6),Origin=c(1,1,2,2,2,3),Destination=c(3,4,1,3,1,4),OriginPop=c(5,5,10,10,10,7))

如果我是你,我会将城市转换为因子,这样,即使一个城市没有出现在你的 Origin 或 Destination 上(例如你的例子,2 没有出现在 Destination 中,4 没有显示in Origin) 它仍然会出现在你的桌子上,所以你可以这样做:

cities[,2:3]<-lapply(cities[,2:3],factor,levels=c(1:4))

然后正如@Tensibai 建议的那样,您可以简单地做:

mytable<-table(cities$Origin,cities$Destination)
mytable
  1 2 3 4
1 0 0 1 1
2 2 0 1 0
3 0 0 0 1
4 0 0 0 0

至于第二部分,我将创建另一个包含每个独特城市及其人口的数据框:

citiespop<-data.frame(cities=unique(cities$Origin),pop=unique(cities$OriginPop))

最后要得到你想要的结果,你可以把 mytable 的行除以那个城市的人口:

mytable[citiespop$cities,]<-mytable[citiespop$cities,]/citiespop$pop
round(mytable,2) # round to make it more readable
    1    2    3    4
1 0.00 0.00 0.20 0.20
2 0.20 0.00 0.10 0.00
3 0.00 0.00 0.00 0.14
4 0.00 0.00 0.00 0.00

【讨论】:

  • 首先,非常感谢!它运作良好,但对于最后一行。 “mytable[citiespop$cities,]
  • 嗨@cassianord,对不起,我花了这么长时间才回复。这听起来很奇怪,你的数据集中有超过 4 个城市吗?如果是这样,您是否将这段代码 lapply(cities[,2:3],factor,levels=c(1:4)) 更改为实际城市数,而不是 4 放置不同城市的总数。
  • 没问题!看,我认为“lapply”函数毕竟存在问题,可能是因为我的源变量和目标变量是必须作为字符串读取的数字(代码)。类似邮政编码的东西。在“lapply”之后,我的数据集变为空,并且起点-终点矩阵仅包含零。此外,代码更改为数字(1、2、3 等),这也是一个问题。哦,是的,我已将代码更改为我的城市数量。
  • 嘿@cassianord。那我们做点别的吧。您可以尝试这样做吗:zip&lt;-unique(c(df$Origin,df$Destination)) 然后执行lapply(cities[,2:3],factor,levels=zip) 并按原样运行其余代码。让我知道它是否有效。
  • 解决了最后一个问题:“lapply”之后数据集不再为空。但最初的问题仍然存在:“mytable[citiespop$cities,] 中的错误:索引超出范围”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多