我正在尝试获取一些数据框并重新整形,以便它们适合使用xts
或zoo
这样的包进行时间序列分析。为此(据我所知),我只需要一个时间序列矩阵和相关变量的值,以宽泛的形式设置。
来自melt
包的cast
和reshape2
似乎是这样做的方式,我使用的方法与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
中的cast
和reshape2
函数重新组织时间序列数据
分析。
one <- melt(dfply, id=c("Date","coreg"))
two <- dcast(one, Date ~ coreg)
但有没有更简单的方法呢?这似乎是一种非常迂回的方式
做一些切换和数据聚合,我感觉我没有正确利用melt
和cast
......
答案 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)