如何从两个向量创建一个源 - 目标矩阵(在R或Stata中)

时间:2016-03-04 15:17:44

标签: r matrix stata flow

我有个人通勤的数据集,如下:

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

其中" id"是个人,"起源"和#34;目的地"是城市。

我想构建一个起始 - 目的地矩阵,如:

        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

1 个答案:

答案 0 :(得分: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则没有显示在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