从R中的数据帧创建成对值的平方矩阵
我有一个如下的数据框,有47个州,以及在这两个州之间乘坐飞机的平均市场票价(州1和州2的顺序无关紧要)。如何将其转换为47x47矩阵,其中每一行和每一列都是一个州名,每个位置的值是这两个州之间的平均市场票价 前6行:从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
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"))
dfdf这太完美了。非常感谢。另外,我需要做的就是将XTAB转换为矩阵形式,然后添加m=forceSymmetric(m,uplo=“U”)
,使其成为对称矩阵,而不是上三角矩阵。但非常感谢,这非常有帮助。