【问题标题】:Extract data from pivot table to data frame (i.e. "reverse the pivot")从数据透视表中提取数据到数据框(即“反转数据透视表”)
【发布时间】:2014-07-21 00:39:29
【问题描述】:

我有以下数据显示一些数字,按年份和月份细分(最近的恰好是第一个,但这不是问题)。

(在 R 中)是否有一种方法可以轻松地将数据透视表“反转”为具有两列“数据”和“值”的数据框?当然,我可以编写一个小程序来完成它(或者,在这种情况下,几分钟的手动工作就可以完成:删除标签,将所有内容放在一行中,而不是在 Excel 中粘贴长行并填写带有填充系列的时间戳),但我很好奇这是否可以在 R 中本地完成,因为它将在未来很有用。

        Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec

2002    315 45  397 750 380 343 794 110 777 323 746 735
2003    748 711 315 395 726 359 799 138 719 345 787 772
2004    109 776 764 738 384 368 396 700 384 398 340 781
2005    747 720 191 938 188 135 185 177 753 733 313 399
2006    726 316 713 135 103 794 751 165 348 701 798 128
2007    763 123 276 111 150 145 163 226 248 950 917 879
2008    167 873 775 130 184 780 444 115 107 325 781 701
2009    897 143 805 104 743 158 113 727 755 764 394 710
2010    349 743 180 762 359 744 102 775 109 178 369 799
2011    746 706 800 737 786 194 195 105 101 784 795 142
2012    124 794 141 126 284 207 877 803 832 175 140 763
2013    796 100 896 119 810 134 100 183 792 185 743 792

【问题讨论】:

  • 现在是这样:这里有很多问题可以解决类似的问题,所以搜索一下可能是值得的。

标签: r pivot pivot-table


【解决方案1】:

有很多方法可以做到这一点。在 vanilla R 中,这是一种方式:

首先,让我们将您的数据读入数据框(您可能会使用read.csv,但我正在复制粘贴您的表格,所以我使用这种方法):

mytable=read.table(stdin(),header=TRUE,row.names=1)
0:         Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
1: 2002    315 45  397 750 380 343 794 110 777 323 746 735
2: 2003    748 711 315 395 726 359 799 138 719 345 787 772
3: 2004    109 776 764 738 384 368 396 700 384 398 340 781
4: 2005    747 720 191 938 188 135 185 177 753 733 313 399
5: 2006    726 316 713 135 103 794 751 165 348 701 798 128
6: 2007    763 123 276 111 150 145 163 226 248 950 917 879
7: 2008    167 873 775 130 184 780 444 115 107 325 781 701
8: 2009    897 143 805 104 743 158 113 727 755 764 394 710
9: 2010    349 743 180 762 359 744 102 775 109 178 369 799
10: 2011    746 706 800 737 786 194 195 105 101 784 795 142
11: 2012    124 794 141 126 284 207 877 803 832 175 140 763
12: 2013    796 100 896 119 810 134 100 183 792 185 743 792
13: 

df1=stack(mytable)
mydf=data.frame(value=df1$values,month=df1$ind,
                year=factor(rownames(mytable))[row(mytable)])
head(mydf)
   value month year
1    315   Jan 2002
2    748   Jan 2003
3    109   Jan 2004
4    747   Jan 2005
5    726   Jan 2006
6    763   Jan 2007

可能还有更有效的方法,并且包中有许多函数可以使这类任务变得简单,但仅仅做这样的事情并不难。

【讨论】:

    【解决方案2】:

    使用stats:::reshape 您可以取得很大的进步(弄清楚如何正确命名月份)。您的问题类似于this one

    > reshape(x, direction = "long", varying = list(2:ncol(x)), idvar = "Year")
            Year time Jan
    2002.1  2002    1 315
    2003.1  2003    1 748
    2004.1  2004    1 109
    2005.1  2005    1 747
    2006.1  2006    1 726
    2007.1  2007    1 763
    

    另一种选择是使用包reshape2

    > library(reshape2)
    > melt(x, id.vars = "Year")
        Year variable value
    1   2002      Jan   315
    2   2003      Jan   748
    3   2004      Jan   109
    4   2005      Jan   747
    5   2006      Jan   726
    6   2007      Jan   763
    7   2008      Jan   167
    

    【讨论】:

      【解决方案3】:

      我尝试使用投票最多的答案,但它对我不起作用,即使我的数据形状相同。我发现另一种方法更简单:

      使用包tidyr:

      mydf1 <- data.frame(mydata %>%
                            pivot_longer(-year, names_to = "month", values_to = "value"))
      

      有关更多信息和更复杂的转换,请参阅: https://tidyr.tidyverse.org/reference/pivot_longer.html

      【讨论】:

        猜你喜欢
        • 2017-07-07
        • 1970-01-01
        • 1970-01-01
        • 2018-04-10
        • 2021-02-20
        • 2021-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多