【问题标题】:time-series in a data frame: re-order data数据框中的时间序列:重新排序数据
【发布时间】:2014-06-19 02:28:23
【问题描述】:

我有一个由测量软件生成的时间序列数据集,结构如下:

ID1 ID2 START   mes1    mes2    mes3    mes4    mes5    mes6
myidA   aa  2000    12  58  45  66  88  77
myidB   aa  2004    44  89  NA  NA  NA  NA
myidC   ab  2001    69  58  77  88  87  NA
myidD   ab  2004    78  66  NA  NA  NA  NA

START 表示保存在第一个测量列 (mes1) 中的较旧测量的年份。对于每个样本(数据框的每一行),起始年份可能不同。

我想创建以下数据框,其中测量按年份排序(用测量年份代替测量的 n°):

ID1 ID2 START   2000    2001    2002    2003    2004    2005
myidA   aa  2000    12  58  45  66  88  77
myidB   aa  2004    NA  NA  NA  NA  44  89
myidC   ab  2001    NA  69  58  77  88  87
myidD   ab  2004    NA  NA  NA  NA  78  66

我可能必须使用时间序列对象,但我不知道如何处理 ID(我需要保留它们)和 START...

【问题讨论】:

  • 您能否详细说明您的数据按年份排列的顺序。这不是那么明显。
  • 好的,总测量值是否总是固定为 6?换句话说,START 的范围是否仅从 2000 年到 2005 年?
  • 是(此处以 2000 年到 2005 年为例)
  • @StephLocke,从表面上看,这些看起来像是重复的,但我不认为这是直接的“重塑”问题。

标签: r time-series reshape


【解决方案1】:

这是我将采取的方法:

library(reshape2)
dfL <- melt(mydf, id.vars=c("ID1", "ID2", "START"))
dfL <- dfL[complete.cases(dfL), ]
head(dfL)
#     ID1 ID2 START variable value
# 1 myidA  aa  2000     mes1    12
# 2 myidB  aa  2004     mes1    44
# 3 myidC  ab  2001     mes1    69
# 4 myidD  ab  2004     mes1    78
# 5 myidA  aa  2000     mes2    58
# 6 myidB  aa  2004     mes2    89

dfL$year <- dfL$START + as.numeric(gsub("mes", "", dfL$variable))-1

dcast(dfL, ID1 + ID2 + START ~ year, value.var="value")
#     ID1 ID2 START 2000 2001 2002 2003 2004 2005
# 1 myidA  aa  2000   12   58   45   66   88   77
# 2 myidB  aa  2004   NA   NA   NA   NA   44   89
# 3 myidC  ab  2001   NA   69   58   77   88   87
# 4 myidD  ab  2004   NA   NA   NA   NA   78   66

基本思想是利用“mes1”、“mes2”值将值“推送”到新加宽的data.frame中的正确位置。


这是我使用的“mydf”,以防其他人想尝试一下。

mydf <- structure(
  list(ID1 = c("myidA", "myidB", "myidC", "myidD"), 
       ID2 = c("aa", "aa", "ab", "ab"), 
       START = c(2000L, 2004L, 2001L, 2004L), 
       mes1 = c(12L, 44L, 69L, 78L), mes2 = c(58L, 89L, 58L, 66L), 
       mes3 = c(45L, NA, 77L, NA), mes4 = c(66L, NA, 88L, NA), 
       mes5 = c(88L, NA, 87L, NA), mes6 = c(77L, NA, NA, NA)), 
  .Names = c("ID1", "ID2", "START", "mes1", "mes2", "mes3", 
             "mes4", "mes5", "mes6"), class = "data.frame", 
  row.names = c(NA, -4L))
mydf
#     ID1 ID2 START mes1 mes2 mes3 mes4 mes5 mes6
# 1 myidA  aa  2000   12   58   45   66   88   77
# 2 myidB  aa  2004   44   89   NA   NA   NA   NA
# 3 myidC  ab  2001   69   58   77   88   87   NA
# 4 myidD  ab  2004   78   66   NA   NA   NA   NA

【讨论】:

    猜你喜欢
    • 2018-01-13
    • 2020-02-24
    • 2019-02-12
    • 2019-01-23
    • 1970-01-01
    • 2016-09-14
    • 2013-08-22
    • 2019-12-20
    • 1970-01-01
    相关资源
    最近更新 更多