使用reshape2重新组织时间序列的数据帧(融化和强制转换)

时间:2013-11-23 21:20:18

标签: r reshape

我正在尝试获取一些数据框并重新整形,以便它们适合使用xtszoo这样的包进行时间序列分析。为此(据我所知),我只需要一个时间序列矩阵和相关变量的值,以宽泛的形式设置。

来自melt包的castreshape2似乎是这样做的方式,我使用的方法与https://stats.stackexchange.com/questions/7439/how-to-change-data-between-wide-and-long-formats-in-r相同。 ..但我遇到了麻烦。

假设这是数据集:

df <- structure(list(Date = structure(c(15461, 15462, 15463, 15461, 
15462, 15461, 15462, 15463, 15461, 15462, 15461, 15462, 15461, 
15462, 15463), class = "Date"), Company = structure(c(2L, 2L, 
2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 1L, 1L, 1L, 1L, 1L), .Label = c("Fakeco", 
"Globcorp", "Renco"), class = "factor"), Region = structure(c(2L, 
2L, 2L, 3L, 3L, 3L, 3L, 3L, 1L, 1L, 3L, 3L, 2L, 2L, 2L), .Label = c("amer", 
"asia", "euro"), class = "factor"), Revenue = c(141L, 467L, 168L, 
359L, 220L, 124L, 303L, 196L, 264L, 461L, 149L, 472L, 287L, 308L, 
333L)), .Names = c("Date", "Company", "Region", "Revenue"), row.names = c(NA, 
-15L), class = "data.frame")

最终,我希望使用每列的唯一日期条目组织数据 区域性公司,以及收入作为价值。

我的第一个猜测是做类似

的事情

1)创建一个变量,它是公司和地区的组合,以便每个组合 可以是一栏:

df$coreg <- do.call(paste, c(df[c("Company", "Region")], sep= "_"))

2)使用plyr重新组织这个新变量

dfply <- ddply(df, c("Date","coreg"),
    function(df) c(Revenue = sum(df[,4])))

3)使用melt中的castreshape2函数重新组织时间序列数据 分析。

one <- melt(dfply, id=c("Date","coreg"))

two <- dcast(one, Date ~ coreg)

但有没有更简单的方法呢?这似乎是一种非常迂回的方式 做一些切换和数据聚合,我感觉我没有正确利用meltcast ......

2 个答案:

答案 0 :(得分:4)

这是您要查找的格式吗?

dcast(df, Date ~ Region + Company, value.var = "Revenue")

#         Date amer_Renco asia_Fakeco asia_Globcorp euro_Fakeco euro_Globcorp euro_Renco
# 1 2012-05-01        264         287           141         149           359        124
# 2 2012-05-02        461         308           467         472           220        303
# 3 2012-05-03         NA         333           168          NA            NA        196

答案 1 :(得分:1)

尝试此操作,忽略警告,或使用suppressWarnings(read.zoo(df, split = 2:3))

library(zoo)
z <- read.zoo(df, split = 2:3)