【问题标题】:Rearrange an R data frame like an Excel PivotTable重新排列 R 数据框,如 Excel 数据透视表
【发布时间】:2011-12-06 17:38:36
【问题描述】:

我在 R 中有以下数据框:

> str(x2)
'data.frame':   262064 obs. of  15 variables:
 $ ykod : int  99 99 99 99 99 99 99 99 99 99 ...
 $ yad  : Factor w/ 38 levels "BAKUGAN","BARBIE",..: 2 2 2 2 2 2 2 2 2 2 ...
 $ per  : Factor w/ 3 levels "2 AYLIK","3 AYLIK",..: 3 3 3 3 3 3 3 3 3 3 ...
 $ donem: int  201106 201106 201106 201106 201106 201106 201106 201106 201106 201106 ...
 $ sayi : int  201106 201106 201106 201106 201106 201106 201106 201106 201106 201106 ...
 $ mkod : int  359 361 362 363 366 849 850 1505 1506 1525 ...
 $ mad  : Factor w/ 9529 levels "    Hilal Gida           ",..: 4473 3322 9360 7169 9359 9290 8903 6057 6055 6620 ...
 $ mtip : Factor w/ 27 levels "Abone Bürosu                                      ",..: 18 18 18 18 18 2 2 10 10 2 ...
 $ kanal: Factor w/ 2 levels "OB","SS": 2 2 2 2 2 2 2 1 1 2 ...
 $ bkod : int  110006 110006 110006 110006 110006 110006 110006 110006 110006 110006 ...
 $ bad  : Factor w/ 208 levels "4. Levent","500 Evler",..: 25 25 25 25 25 25 25 25 25 25 ...
 $ bolge: Factor w/ 12 levels "Adana Şehiriçi",..: 7 7 7 7 7 7 7 7 7 7 ...
 $ sevk : int  5 2 2 2 10 4 3 13 32 4 ...
 $ iade : int  0 2 1 2 4 3 2 0 8 4 ...
 $ satis: int  5 0 1 0 6 1 1 13 24 0 ...

是否可以像 Excel 数据透视表一样重新排列此数据框?例如,我想以ykod = 99 并创建一个具有新行和列的新数据框,如下所示:

                   donem=201106     donem=201107     donem=201108
Row#  mkod  mad   sevk iade satis  sevk iade satis  sevk iade satis
----  ----  ---   ---- ----- ----  ---- ---- ----   ---- ----- ----   
1     654   Abc    10    2    8     15   12   3       8    3    5
2     721   Def
.
. 
4345

当然,上例中的列名也要重新创建,例如201106_sevk201106_iade201106_satis等等。

【问题讨论】:

  • 我认为这对于数据处理来说是不应该的......而且这也没有用于正确的 sql 查询。这只是为了数据呈现,但为了进一步处理,你迟早会发现这很不方便。我建议像使用过滤一样处理数据 - 例如 x2[x2$donem==201106,c('sevk','iade','satis')] 而不是尝试将 donem=201106 设为一列。然后,当您需要展示结果时,将它们导出到 Excel 并在那里制作数据透视表。
  • 此讨论stackoverflow.com/questions/6242106/… 可能与 Tomas T. 的论点有关。不要指望那里有解决方案,而是要掌握何时使用 R 何时使用 Excel。也许它可以帮助您找到您的个人喜好...

标签: r dataframe pivot-table


【解决方案1】:

查看reshapeplyr 包。 reshape 包可以以更可重复的方式完成数据透视表的大部分(可能是所有)好的部分,并且为您提供了更多关于您可能想要计算和显示的摘要的选项。 plyr 包适用于您想要拆分数据结构、对部分进行计算或一组计算,然后将结果重新组合在一起的任何情况。

【讨论】:

    【解决方案2】:

    我不认为这对数据处理是应得的......而且这也没有用于正确的 sql 查询。这通常仅用于数据表示,但对于进一步处理,您迟早会发现这很不方便。我建议按照使用过滤的方式处理数据 - 例如 x2[x2$donem==201106,c('sevk','iade','satis')] 而不是尝试将 donem=201106 设为一列。然后,当您需要呈现结果时,将它们导出到 excel 并在那里制作数据透视表。

    但是,如果你仍然坚持它,它有点笨拙,但你可以尝试tapply(我相信R家伙会提供更好的解决方案):

    pivot = tapply(df$value, list(df$row, df$column), identity)
    

    然后您可以cbind() 其他行属性,也可以更改列名,如:

    colnames(pivot) = paste("var_", colnames(pivot), sep = "") 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-10
      • 1970-01-01
      • 1970-01-01
      • 2016-12-04
      • 1970-01-01
      • 2016-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多