我有个人通勤的数据集,如下:
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
等
答案 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