我有一个长格式data.frame
,我想用它来构建一个宽格式zoo
系列。
data.frame
看起来像:
Date Label Value
1 2015-03-21 A 1
2 2015-03-22 B 6
3 2015-03-22 A 2
4 2015-03-23 A 7
5 2015-03-23 B 5
...
例如:
d <- data.frame(
Date = c(Sys.Date() - 2, Sys.Date() - 1, Sys.Date() -1, Sys.Date(), Sys.Date()),
Label = c("A", "B", "A", "A", "B"),
Value = c(1, 6, 2, 7, 5))
我的结果应该是zoo
,如下所示:
A B ...
2015-03-21 1 NA ...
2015-03-22 2 6 ...
2015-03-23 7 5 ...
...
我已成功实现此目的:
f <- function(x) {
zoo(x$Value, order.by = x$Date)
}
do.call(merge.zoo, by(d, factor(d$Label), f))
其中d
是data.frame
。
但是,当d
只包含一个Label
时,会在某处删除列名:
2015-03-21 2015-03-22 2015-03-23
1 2 7
和names(d)
给出NULL
。
即使输出zoo
是单变量的,我如何维护列名呢?
答案 0 :(得分:3)
使用split=
的{{1}}参数拆分第二列:
read.zoo
,并提供:
library(zoo)
read.zoo(d, split = 2)
答案 1 :(得分:0)
问题是默认情况下merge.zoo
会删除单变量zoo
的名称。
将drop = F
传递给args列表可以覆盖此行为。我们可以使用merge.zoo
的部分函数应用程序在使用do.call
时实现此目的:
f <- function(x) {
zoo(x$Value, order.by = x$Date)
}
s <- do.call(partial(merge.zoo, drop = F), by(d, factor(d$Label), f))
或没有部分:
s <- do.call(merge.zoo, append(by(d, factor(d$Label), f), list(drop = F)))
对于d <- d[d$Label == "A", ]
,这给出了:
A
2015-03-21 1
2015-03-22 2
2015-03-23 7
请注意,部分函数应用程序需要pryr
包。