R:你能从reshape / cast中指定变量列的顺序吗?

时间:2013-09-17 11:42:37

标签: r reshape

我正在使用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多列的真实情况下更加麻烦。

谢谢,

2 个答案:

答案 0 :(得分:2)

我没有看到原因,为什么列顺序应该重要。但是,您可以随时更改顺序:

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

请注意,package reshape2主要取代了reshape。

答案 1 :(得分:0)

我在这里找到: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

希望得到这个帮助。