首页 > 解决方案 > 试图在 R 中转置数据

问题描述

我希望在 R 中转置数据。我有以下数据框。

旧表

我需要转置它,以便列行如下所示:

新表

依此类推,因此该表将有 90 行(每个源目标 9 行)

最好和最快的方法是什么?

标签: r

解决方案


看来您有一个对称矩阵。你可以dist2df我的 SOfun 包中使用。

以下是一些示例数据:

 df <- structure(list(City = structure(c(2L, 5L, 4L, 3L, 1L), .Label = c("CFMG", 
     "CONT", "DILG", "DMNR", "INTG"), class = "factor"), CONT = c(0,             
     0.566595445231594, 0.576844266554399, 0.493804001521439, 0.431543849302017  
     ), INTG = c(0.566595445231594, 0, 0.0176923632394502, 0.0642444500652801,   
     0.0929571208871039), DMNR = c(0.576844266554399, 0.0176923632394502,        
     0, 0.0815745238751543, 0.093320922043577), DILG = c(0.493804001521439,      
     0.0642444500652801, 0.0815745238751543, 0, 0.0206006197275541               
     ), CFMG = c(0.431543849302017, 0.0929571208871039, 0.093320922043577,       
     0.0206006197275541, 0)), row.names = c(NA, 5L), class = "data.frame")  

df
#   City      CONT       INTG       DMNR       DILG       CFMG
# 1 CONT 0.0000000 0.56659545 0.57684427 0.49380400 0.43154385
# 2 INTG 0.5665954 0.00000000 0.01769236 0.06424445 0.09295712
# 3 DMNR 0.5768443 0.01769236 0.00000000 0.08157452 0.09332092
# 4 DILG 0.4938040 0.06424445 0.08157452 0.00000000 0.02060062
# 5 CFMG 0.4315438 0.09295712 0.09332092 0.02060062 0.00000000

dist2df函数需要一个dist对象,因此as.distdata.frame删除第一列之后使用:

library(SOfun)
dist2df(as.dist(df[-1]))
#     row  col      value
# 1  INTG CONT 0.56659545
# 2  DMNR CONT 0.57684427
# 3  DILG CONT 0.49380400
# 4  CFMG CONT 0.43154385
# 5  DMNR INTG 0.01769236
# 6  DILG INTG 0.06424445
# 7  CFMG INTG 0.09295712
# 8  DILG DMNR 0.08157452
# 9  CFMG DMNR 0.09332092
# 10 CFMG DILG 0.02060062

您也可以melt通过以下方式使用。这种方法会保留对角线,而dist2df不会。

library(data.table)

df1 <- df # making a copy since we're destructively editing the data
df1[cbind(FALSE, upper.tri(df[-1]))] <- NA
melt(as.data.table(df1), "City", na.rm = TRUE)
#     City variable      value
#  1: CONT     CONT 0.00000000
#  2: INTG     CONT 0.56659545
#  3: DMNR     CONT 0.57684427
#  4: DILG     CONT 0.49380400
#  5: CFMG     CONT 0.43154385
#  6: INTG     INTG 0.00000000
#  7: DMNR     INTG 0.01769236
#  8: DILG     INTG 0.06424445
#  9: CFMG     INTG 0.09295712
# 10: DMNR     DMNR 0.00000000
# 11: DILG     DMNR 0.08157452
# 12: CFMG     DMNR 0.09332092
# 13: DILG     DILG 0.00000000
# 14: CFMG     DILG 0.02060062
# 15: CFMG     CFMG 0.00000000

推荐阅读