【问题标题】:reshaping data frame in R: changing a column to row name在 R 中重塑数据框:将列更改为行名
【发布时间】:2015-12-07 15:55:39
【问题描述】:

我在 R 中工作。我有一个包含三列的数据框。 A列包含公司名称,b列包含日期,c列包含价格

>

   A           B          C
  Apple     2012/06/01   410
  Coke      2012/06/01   210
  Pepsi     2012/06/01   152
  Apple     2012/06/02   420
  Coke      2012/06/02   220
  Pepsi     2012/06/02   142
  Apple     2012/06/03   440
  Coke      2012/06/03   260
  Pepsi     2012/06/03   122

我想重塑我的数据框,使公司名称成为行名,日期成为列名,价格在相应的单元格中

             Apple     Coke    Pepsi

2012/06/03   410      210      152
2012/06/03   420      220      142
2012/06/03   460      260      162

我尝试过使用 melt 和 dcast 功能,但找不到解决方案。

【问题讨论】:

标签: r


【解决方案1】:

我们可以使用基础包stats中的函数reshape

reshape(df, idvar='B', timevar='A', direction='wide')

输出:

           B C.Apple C.Coke C.Pepsi
1 2012/06/01     410    210     152
4 2012/06/02     420    220     142
7 2012/06/03     440    260     122

数据:

df <- structure(list(A = c("Apple", "Coke", "Pepsi", "Apple", "Coke", 
           "Pepsi", "Apple", "Coke", "Pepsi"), 
           B = c("2012/06/01", "2012/06/01", "2012/06/01", "2012/06/02", 
                 "2012/06/02", "2012/06/02", "2012/06/03", "2012/06/03", 
                 "2012/06/03"), 
            C = c(410L, 210L, 152L, 420L, 220L, 142L, 440L, 260L, 122L)),
           .Names = c("A", "B", "C"),
            class = "data.frame", row.names = c(NA, -9L))

【讨论】:

    【解决方案2】:

    您可以使用 reshape2 包中的 dcast() 函数将数据从“长”格式重新调整为“宽”格式:

    library(reshape2)
    dcast(df1, B ~ A , value.var = "C")
    #           B Apple Coke Pepsi
    #1 2012/06/01   410  210   152
    #2 2012/06/02   420  220   142
    #3 2012/06/03   440  260   122
    

    数据

    df1 <- structure(list(A = c("Apple", "Coke", "Pepsi", "Apple", "Coke", 
               "Pepsi", "Apple", "Coke", "Pepsi"), 
               B = c("2012/06/01", "2012/06/01", "2012/06/01", "2012/06/02", 
                     "2012/06/02", "2012/06/02", "2012/06/03", "2012/06/03", 
                     "2012/06/03"), 
                C = c(410L, 210L, 152L, 420L, 220L, 142L, 440L, 260L, 122L)),
               .Names = c("A", "B", "C"),
                class = "data.frame", row.names = c(NA, -9L))
    

    webpage 是一个源示例,它提供了已使用命令的说明。它还描述了转换数据格式的其他可能性。

    【讨论】:

      【解决方案3】:

      你可以使用tidyr::spread

      library(tidyr)
      spread(d,A,C)
      

      输出

                 B Apple Coke Pepsi
      1 2012/06/01   410  210   152
      2 2012/06/02   420  220   142
      3 2012/06/03   440  260   122
      

      数据

      d <- read.table(text="   A           B          C
        Apple     2012/06/01   410
        Coke      2012/06/01   210
        Pepsi     2012/06/01   152
        Apple     2012/06/02   420
        Coke      2012/06/02   220
        Pepsi     2012/06/02   142
        Apple     2012/06/03   440
        Coke      2012/06/03   260
        Pepsi     2012/06/03   122",head=TRUE)
      

      【讨论】:

        猜你喜欢
        • 2012-07-28
        • 2022-12-05
        • 1970-01-01
        • 2016-12-11
        • 1970-01-01
        • 1970-01-01
        • 2014-10-10
        • 2021-08-05
        • 1970-01-01
        相关资源
        最近更新 更多