【问题标题】:R: Can you specify the order of variable columns from reshape/cast?R:你能从 reshape/cast 中指定变量列的顺序吗?
【发布时间】:2013-09-17 11:42:36
【问题描述】:

我正在使用cast 函数创建一个宽格式数据框。我希望能够控制使用cast 产生的列的顺序。这可能吗?

在下面的示例中,它们是顺序:cogs_xdep, sales, sga

我想订购它们:sales, cogs_xdep, sga

整个过程实际上是从一个宽格式帧开始的,我在演员表之前使用melt 将其更改为长格式。

下面是一个例子

>rawdata_all
  coy_name gvkey_iid    factor X20130930 X20130831 X20130731 X20130630 X20130531    X20130430 X20130331 X20130228 X20130131 X20121231
1    Coy 1    111111     sales         1         2         3         4         5         6         7         8         9        10
2    Coy 2     22222     sales         2        12        22        32        42        52        62        72        82        92
3    Coy 3    333333     sales         3       103       203       303       403       503       603       703       803       903
4    Coy 1    111111 cogs_xdep         4         5         6         7         8         9        10        11        12        13
5    Coy 2     22222 cogs_xdep         5        15        25        35        45        55        65        75        85        95
6    Coy 3    333333 cogs_xdep         6       106       206       306       406       506       606       706       806       906
7    Coy 1    111111       sga         7         8         9        10        11        12        13        14        15        16
8    Coy 2     22222       sga         8        18        28        38        48        58        68        78        88        98
9    Coy 3    333333       sga         9       109       209       309       409       509       609       709       809       909
...

融化成长格式

> non_data_cols <- 3       # There are 3 non-value columns

> master_long <- melt(rawdata_all, id=1:non_data_cols,measured=(non_data_cols+1):length(rawdata_all))

> master_long

    coy_name gvkey_iid    factor  variable value
1      Coy 1    111111     sales X20130930     1
2      Coy 2     22222     sales X20130930     2
3      Coy 3    333333     sales X20130930     3
4      Coy 1    111111 cogs_xdep X20130930     4
5      Coy 2     22222 cogs_xdep X20130930     5
6      Coy 3    333333 cogs_xdep X20130930     6
7      Coy 1    111111       sga X20130930     7
8      Coy 2     22222       sga X20130930     8
...

最后使用“因子”来创建更宽的数据框。 (我还将“变量”重命名为“日期”,并从日期值的开头删除了“X”)。

> master <- cast(master_long, ...~factor)
 coy_name gvkey_iid     date cogs_xdep sales  sga
1     Coy 1    111111 20130930         4     1    7
2     Coy 1    111111 20130831         5     2    8
3     Coy 1    111111 20130731         6     3    9
4     Coy 1    111111 20130630         7     4   10
5     Coy 1    111111 20130531         8     5   11
6     Coy 1    111111 20130430         9     6   12
7     Coy 1    111111 20130331        10     7   13
8     Coy 1    111111 20130228        11     8   14
9     Coy 1    111111 20130131        12     9   15
10    Coy 1    111111 20121231        13    10   16
...

理想情况下,我希望最后 3 列按以下顺序排列:sales、cogs_xdep、sga。 cast 似乎已按字母顺序排列它们,您可以看到它们在原始数据帧和长格式数据帧中都以所需的方式排序。

任何建议将不胜感激。虽然重新排列只有 3 列的列很容易,但在 30 列以上的实际情况下会比较麻烦。

谢谢,

【问题讨论】:

    标签: r reshape


    【解决方案1】:

    我看不出为什么列顺序很重要。但是,您始终可以像这样更改顺序:

    master[,c(names(master)[1:3], as.character(unique(master_long$factor)))]
    
       coy_name gvkey_iid  variable sales cogs_xdep sga
    1     Coy_1    111111 X20130930     1         4   7
    2     Coy_1    111111 X20130831     2         5   8
    3     Coy_1    111111 X20130731     3         6   9
    4     Coy_1    111111 X20130630     4         7  10
    5     Coy_1    111111 X20130531     5         8  11
    6     Coy_1    111111 X20130430     6         9  12
    7     Coy_1    111111 X20130331     7        10  13
    8     Coy_1    111111 X20130228     8        11  14
    9     Coy_1    111111 X20130131     9        12  15
    10    Coy_1    111111 X20121231    10        13  16
    11    Coy_2     22222 X20130930     2         5   8
    12    Coy_2     22222 X20130831    12        15  18
    13    Coy_2     22222 X20130731    22        25  28
    14    Coy_2     22222 X20130630    32        35  38
    15    Coy_2     22222 X20130531    42        45  48
    16    Coy_2     22222 X20130430    52        55  58
    17    Coy_2     22222 X20130331    62        65  68
    18    Coy_2     22222 X20130228    72        75  78
    19    Coy_2     22222 X20130131    82        85  88
    20    Coy_2     22222 X20121231    92        95  98
    21    Coy_3    333333 X20130930     3         6   9
    22    Coy_3    333333 X20130831   103       106 109
    23    Coy_3    333333 X20130731   203       206 209
    24    Coy_3    333333 X20130630   303       306 309
    25    Coy_3    333333 X20130531   403       406 409
    26    Coy_3    333333 X20130430   503       506 509
    27    Coy_3    333333 X20130331   603       606 609
    28    Coy_3    333333 X20130228   703       706 709
    29    Coy_3    333333 X20130131   803       806 809
    30    Coy_3    333333 X20121231   903       906 909
    

    请注意,reshape2 包大部分已取代 reshape。

    【讨论】:

    • 谢谢 Roland,我通常不需要订购它们,但这只是漫长而复杂的过程中的一步,订购它们可以简化它。此解决方案的轻微变化可以完美运行,谢谢。
    • 因为我有类似的问题,并且有多个数据集的数据级别名称有多种变化,有没有办法在 data.table 的 dcast 中声明不要按字母顺序更改因素,还是尊重给定的顺序?
    【解决方案2】:

    我在这里找到:dcast - order factors 如何告诉 dcast 不要按字母顺序更改因子的顺序。

       dff<-structure(list(ID_no = c(2, 2, 2, 2, 2, 29, 29, 29, 29, 29), 
    Variable = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L,  2L), 
      .Label = c("q1", "q2"    ), class = "factor"), 
      Levels = structure(c(1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L), 
        .Label = c("vf1", "df2", "fd3", "re4", "fr5"    ), class = "factor"), 
      Frequency = c(2, 15, 41, 28, 20, 6,  0, 5, 27, 82), 
      Percentage = c(1.89, 14.15, 38.68, 26.42,  18.87, 5, 0, 4.17, 22.5, 68.33)), 
      .Names = c("ID_no", "Variable", "Levels", "Frequency", "Percentage"),
      row.names = c(NA, -10L), class = c("data.table", "data.frame"))
    
    
    
    
    
     ID_no  Variable Levels   Frequency   Percentage
     1:     2       q1    vf1         2       1.89
     2:     2       q1    df2        15      14.15
     3:     2       q1    fd3        41      38.68
     4:     2       q1    re4        28      26.42
     5:     2       q1    fr5        20      18.87
     6:    29       q2    vf1         6       5.00
     7:    29       q2    df2         0       0.00
     8:    29       q2    fd3         5       4.17
     9:    29       q2    re4        27      22.50
    10:    29       q2    fr5        82      68.33
    
     dcast(setDT(dff), Variable~factor(Levels, levels=unique(Levels)), value.var=c("Percentage"))
    

    一些随机因子水平,用数字表示它们的顺序。

      Variable  vf1   df2   fd3   re4   fr5
    1:       q1 1.89 14.15 38.68 26.42 18.87
    2:       q2 5.00  0.00  4.17 22.50 68.33
    

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2013-12-07
      • 2022-11-10
      • 2017-07-03
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多