在R中,如何通过和动物园维护列名?

时间:2015-03-23 10:13:46

标签: r dataframe zoo names

我有一个长格式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))

其中ddata.frame

但是,当d只包含一个Label时,会在某处删除列名:

2015-03-21 2015-03-22 2015-03-23 
         1          2          7

names(d)给出NULL

即使输出zoo是单变量的,我如何维护列名呢?

2 个答案:

答案 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包。