【问题标题】:Reshaping dataset重塑数据集
【发布时间】:2012-04-12 19:40:05
【问题描述】:

我只是想知道您是否可以指导我如何根据特定标准重塑数据集以按小时排列,例如,我有以下示例数据集:

我正在尝试将数据集重塑为如下所示:

请问我该如何进行这种重塑?非常感谢。

My sample data:

data = structure(list(date = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L), .Label = "Jan-97", class = "factor"), day = c(1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L), hour = c(1L, 2L, 
3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), Value = c(65L, 29L, 
31L, 42L, 42L, 52L, 61L, 57L, 55L, 52L, 57L, 46L)), .Names = c("date", 
"day", "hour", "Value"), class = "data.frame", row.names = c(NA, 
-12L))

【问题讨论】:

    标签: r


    【解决方案1】:

    这使用reshape2 包。我确信可以使用reshape 函数来完成,但我并不那么容易。

    library("reshape2")
    dcast(data, date+day~hour, value.var="Value")
    

    给了

    > dcast(data, date+day~hour, value.var="Value")
        date day  1  2  3  4
    1 Jan-97   1 65 29 31 42
    2 Jan-97   2 42 52 61 57
    3 Jan-97   3 55 52 57 46
    

    如果您不喜欢其中的名称,您可以在之后更改它们。

    widedata <- dcast(data, date+day~hour, value.var="Value")
    names(widedata)[-(1:2)] <- paste0("hour",names(widedata[-(1:2)]))
    

    所以widedata 是:

    > widedata
        date day hour1 hour2 hour3 hour4
    1 Jan-97   1    65    29    31    42
    2 Jan-97   2    42    52    61    57
    3 Jan-97   3    55    52    57    46
    

    【讨论】:

    • +1 我还在打字。 reshape 包和 cast 会做同样的事情。 cast(data, date+day~hour, value='Value')
    • 感谢布赖恩和贾斯汀,这正是我一直在寻找的,以了解如何进行总体重塑。再次感谢,问候,#
    【解决方案2】:

    这可以使用reshape解决

    reshape(data, idvar=c('date','day'), direction='wide', timevar='hour')
    

    【讨论】:

    • 感谢 Smu 的回答,第一个更适合我正在寻找的内容,但感谢您尝试帮助我:)
    【解决方案3】:

    这是一种在base中实现的方法:

    reshape(data, timevar = c("hour"), v.names = c("Value"),  
        idvar = c("date", "day"), direction = "wide")
    

    编辑:如果想保留名称,就像 Brian 使用的那样:

    names(DF)[-c(1:2)] <- paste0("hour", 1:4)
    rownames(DF)<- 1:nrow(DF)
    DF
    

    产量:

        date day hour1 hour2 hour3 hour4
    1 Jan-97   1    65    29    31    42
    2 Jan-97   2    42    52    61    57
    3 Jan-97   3    55    52    57    46
    

    【讨论】:

      【解决方案4】:

      使用dplyrtidyr 包的更新:

      library(tidyr)
      library(dplyr)
      data %>% mutate(hour=paste0('hour', hour)) %>% spread(hour, Value)
      #    date day hour1 hour2 hour3 hour4
      #1 Jan-97   1    65    29    31    42
      #2 Jan-97   2    42    52    61    57
      #3 Jan-97   3    55    52    57    46
      

      【讨论】:

      • 如果要更改列名,library(dplyr); data %&gt;% mutate(hour=paste0('hour', hour)) %&gt;% spread(hour, Value)) 或直接使用spread(data, hour,Value) %&gt;% setNames(., c(names(.)[1:2], paste0('hour', names(.)[3:6])))
      • @akrun 看起来好多了。我将通过其他示例来练习宽而长的重塑。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-08
      • 2017-06-10
      • 2018-11-21
      • 2019-10-05
      • 2021-09-23
      相关资源
      最近更新 更多