【问题标题】:Reshape backandforth Wide -> long -> wide来回重塑宽 -> 长 -> 宽
【发布时间】:2019-12-01 15:46:20
【问题描述】:

我把我的数据改成xts来做简单的计算,所以我先把我的数据从长改成宽,做我的计算,然后想把它改回来。

首先我的数据看起来像:

          date seriesid       totret
1912-08-15    57409  0.000000000
1912-09-15    57409 -0.500000000
1912-10-15    57409  0.000000000
1912-11-15    57409  0.000000000
1912-12-15    57409  0.000000000
1913-01-15    57409  0.000000000
1913-02-15    57409  0.000000000
1913-03-15    57409  0.500000000
1913-04-15    57409 -0.250000000
1913-05-15    57409  0.000000000
1913-06-15    57409  0.000000000
1913-07-15    57409  0.000000000
1913-08-15    57409  0.000000000
1913-09-15    57409  0.000000000
1925-02-15    57746  0.001984127
1925-03-15    57746  0.049504950
1925-05-15    57746  0.190476190
1925-06-15    57746 -0.088333333
1925-08-15    57746  0.015384615
1925-09-15    57746  0.030303030

然后我重铸它:

z <-reshape(PreCRSP, idvar="date", timevar = "seriesid", direction ="wide")
z <- as.data.table(z)
z <- as.xts.data.table(z)

port_rolling_sd_xts <- rollapply(z,FUN = sd,width = 36) 

现在我有下面的矩阵,想把它转回来,我该怎么做?

index totret.57409 totret.57746 totret.55630 totret.55578
1824-01-15           NA           NA           NA           NA
1824-02-15           NA           NA           NA           NA
1824-03-15           NA           NA           NA           NA
1824-04-15           NA           NA           NA           NA
1824-05-15           NA           NA           NA           NA

我希望它恢复为以下格式:

date seriesid  sd
1912-08-15    57409  0.000000000
1912-09-15    57409 -0.500000000
1912-10-15    57409  0.000000000
1912-11-15    57409  0.000000000

答案是:

sd <- tidyr::spread(Pre, key = "seriesid", value = "totret")
sd <- as.data.table(sd)
sd <- as.xts.data.table(sd)
sd <- rollapply(sd, FUN = sd, width = 36) 
sd <- as.data.table(sd)
SD <- tidyr::gather(sd, seriesid, sd, -index, na.rm=TRUE)
names(SD) <- c("date","seriesid","sd")
PreCRSPwithsd <- merge(Pre, SD, by=c("date", "seriesid"), all.x=TRUE)

【问题讨论】:

  • 如果你是data.table,我想你可以使用melt
  • 你能分享一些可重现的示例数据吗?使用dput 或此处的任何方式how-to-make-a-great-r-reproducible-example 会很有帮助!
  • 你也可以使用 tidyr::gather(从宽到长)和 tidyr::spread(从长到宽)
  • 谢谢,Tidyr 工作了!

标签: r reshape


【解决方案1】:

这里是 reshape2 和 tidyr 选项的一个很好的概述:

http://www.cookbook-r.com/Manipulating_data/Converting_data_between_wide_and_long_format/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    • 2021-02-09
    • 2015-10-25
    • 2016-06-27
    相关资源
    最近更新 更多