从R中的数据帧创建成对值的平方矩阵

从R中的数据帧创建成对值的平方矩阵,r,dataframe,matrix,dplyr,data-science,R,Dataframe,Matrix,Dplyr,Data Science,我有一个如下的数据框,有47个州,以及在这两个州之间乘坐飞机的平均市场票价(州1和州2的顺序无关紧要)。如何将其转换为47x47矩阵,其中每一行和每一列都是一个州名,每个位置的值是这两个州之间的平均市场票价 前6行: State 1 State 2 Mean Market Fare 1 Alabama Alabama 263.3752 2 Alabama Arizona 320.5036 3 Alabama Arkansas

我有一个如下的数据框,有47个州,以及在这两个州之间乘坐飞机的平均市场票价(州1和州2的顺序无关紧要)。如何将其转换为47x47矩阵,其中每一行和每一列都是一个州名,每个位置的值是这两个州之间的平均市场票价

前6行:

  State 1     State 2 Mean Market Fare
1 Alabama     Alabama         263.3752
2 Alabama     Arizona         320.5036
3 Alabama    Arkansas         288.9775
4 Alabama  California         352.6983
5 Alabama    Colorado         282.6864
6 Alabama Connecticut         266.9601
           State 1   State 2 Mean Market Fare
1097    Washington   Wyoming         286.9314
1098 West Virginia Wisconsin         302.7769
1099 West Virginia   Wyoming         493.2000
1100     Wisconsin Wisconsin         251.3333
1101     Wisconsin   Wyoming         285.3015
1102       Wyoming   Wyoming         275.9800
最后6行:

  State 1     State 2 Mean Market Fare
1 Alabama     Alabama         263.3752
2 Alabama     Arizona         320.5036
3 Alabama    Arkansas         288.9775
4 Alabama  California         352.6983
5 Alabama    Colorado         282.6864
6 Alabama Connecticut         266.9601
           State 1   State 2 Mean Market Fare
1097    Washington   Wyoming         286.9314
1098 West Virginia Wisconsin         302.7769
1099 West Virginia   Wyoming         493.2000
1100     Wisconsin Wisconsin         251.3333
1101     Wisconsin   Wyoming         285.3015
1102       Wyoming   Wyoming         275.9800

您可以使用
tidyr
中的
pivot\u wide
将数据帧重塑为更宽的格式

在这里,使用名为“df”的数据帧中示例的第一行:

df
州1州2平均市价
1:阿拉巴马州阿拉巴马州263.3752
2:亚拉巴马州亚利桑那州320.5036
3:阿拉巴马州阿肯色州288.9775
4:阿拉巴马州加利福尼亚州352.6983
5:阿拉巴马州科罗拉多州282.6864
6:阿拉巴马州康涅狄格州266.9601
你可以做:

library(tidyr)
图书馆(dplyr)
df%>%pivot\u更宽(名称\u from=State2,值\u from=Mean\u Market\u Fare)
州1阿拉巴马州亚利桑那州阿肯色州加利福尼亚州科罗拉多州康涅狄格州
1阿拉巴马州263.3752 320.5036 288.9775 352.6983 282.6864 266.9601
它回答了你的问题吗


可复制示例

结构(列表(州1=c(“阿拉巴马州”、“阿拉巴马州”、“阿拉巴马州”、“阿拉巴马州”), “阿拉巴马州”、“阿拉巴马州”,州2=c(“阿拉巴马州”、“亚利桑那州”、“阿肯色州”, “加利福尼亚州”、“科罗拉多州”、“康涅狄格州”,平均市价=c(263.3752, 320.5036288.9775352.6983282.6864266.9601),row.names=c(NA, -6L),class=c(“数据表”、“数据帧”))
使用data.table的
dcast()
函数,将其分散到state 2变量上:

dcast(dtName, state1 ~ state2, value.vars = meanMarketFare)
一个玩具的例子

library(data.table)
DT1 <- data.table(
  "V1" = c("a", "a", "b"),
  "V2" = c("b", "c", "c"),
  "V3" = c(2,6,9))

dcast(DT1, V1 ~ V2, value.vars = V3)
注意,您也可以将其缩短为

dcast(DT1, ... ~ state2)

我想您可以使用
xtabs

xtabs(Mean_Market_Fare~.,df)
以致

> xtabs(Mean_Market_Fare~.,df)
               State_2
State_1          Alabama  Arizona Arkansas California Colorado Connecticut Wisconsin  Wyoming
  Alabama       263.3752 320.5036 288.9775   352.6983 282.6864    266.9601    0.0000   0.0000
  Washington      0.0000   0.0000   0.0000     0.0000   0.0000      0.0000    0.0000 286.9314
  West Virginia   0.0000   0.0000   0.0000     0.0000   0.0000      0.0000  302.7769 493.2000
  Wisconsin       0.0000   0.0000   0.0000     0.0000   0.0000      0.0000  251.3333 285.3015
  Wyoming         0.0000   0.0000   0.0000     0.0000   0.0000      0.0000    0.0000 275.9800
数据

df <- structure(list(State_1 = c("Alabama", "Alabama", "Alabama", "Alabama", 
"Alabama", "Alabama", "Washington", "West Virginia", "West Virginia", 
"Wisconsin", "Wisconsin", "Wyoming"), State_2 = c("Alabama", 
"Arizona", "Arkansas", "California", "Colorado", "Connecticut", 
"Wyoming", "Wisconsin", "Wyoming", "Wisconsin", "Wyoming", "Wyoming"
), Mean_Market_Fare = c(263.3752, 320.5036, 288.9775, 352.6983, 
282.6864, 266.9601, 286.9314, 302.7769, 493.2, 251.3333, 285.3015, 
275.98)), class = "data.frame", row.names = c("1", "2", "3", 
"4", "5", "6", "7", "8", "9", "10", "11", "12"))

df
df这太完美了。非常感谢。另外,我需要做的就是将XTAB转换为矩阵形式,然后添加
m=forceSymmetric(m,uplo=“U”)
,使其成为对称矩阵,而不是上三角矩阵。但非常感谢,这非常有帮助。