将数据框(面板数据)转换为动物园

时间:2014-06-02 09:10:57

标签: r dataframe type-conversion zoo

如何将以下数据框(面板数据)转换为动物园?让df表示我的数据框;

Ctry  year   Carx   Brx
 A    2000    23     12
 A    2001    18     16
 A    2002    20     20
 A    2003    NA     18
 A    2004    24     NA
 A    2005    18     12
 B    2000    NA     22
 B    2001    NA     20
 B    2002    NA     14
 B    2003    NA     NA
 B    2004    18     NA
 B    2005    16     14   
 C    2000    NA     NA
 C    2001    NA     25
 C    2002    24     32
 C    2003    21     NA
 C    2004    NA     15
 C    2005    24     NA

我尝试过以下代码

df.zoo=zoo(df[,-2], order.by=as.Date(strptime(as.character(df[,2]), "%Y")))

我通过警告得到以下结果:"如果'order.by'中的索引条目不是唯一的,那么“zoo”对象的某些方法不起作用"

    year     Ctry   Carx   Brx
 2000-06-02    A    23     12
 2000-06-02    B    NA     22
 2000-06-02    C    NA     NA
    ..        ..    ..     ..

上述数据框最适合在动物园包中执行功能的转换形式是什么?

非常感谢你的帮助......

1 个答案:

答案 0 :(得分:1)

分裂的动物园我们不能拥有看起来像问题中的样本输出的动物园对象;但是,如果我们将问题更改为需要广泛的时间序列,我们可以将read.zoosplit参数一起使用:

z <- read.zoo(DF, split = "Ctry", index = "year", FUN = identity)

,并提供:

> z
     Carx.A Brx.A Carx.B Brx.B Carx.C Brx.C
2000     23    12     NA    22     NA    NA
2001     18    16     NA    20     NA    25
2002     20    20     NA    14     24    32
2003     NA    18     NA    NA     21    NA
2004     24    NA     18    NA     NA    15
2005     18    12     16    14     24    NA

两个动物园对象或者,考虑创建两个动物园对象:

Carx.z <- read.zoo(DF[, -3], split = "Ctry", index = "year", FUN = identity)
Brx.z <- read.zoo(DF[, -4], split = "Ctry", index = "year", FUN = identity)

,并提供:

> Carx.z
      A  B  C
2000 12 22 NA
2001 16 20 25
2002 20 14 32
2003 18 NA NA
2004 NA NA 15
2005 12 14 NA
> Brx.z
      A  B  C
2000 23 NA NA
2001 18 NA NA
2002 20 NA 24
2003 NA NA 21
2004 24 18 NA
2005 18 16 24

注意:在动态范围read.zoo的开发版中,能够自动找出FUN = identity部分,以便可以删除参数。

可重现的测试数据。我们在上面使用了以下数据框DF

Lines <- "Ctry  year   Carx   Brx
 A    2000    23     12
 A    2001    18     16
 A    2002    20     20
 A    2003    NA     18
 A    2004    24     NA
 A    2005    18     12
 B    2000    NA     22
 B    2001    NA     20
 B    2002    NA     14
 B    2003    NA     NA
 B    2004    18     NA
 B    2005    16     14   
 C    2000    NA     NA
 C    2001    NA     25
 C    2002    24     32
 C    2003    21     NA
 C    2004    NA     15
 C    2005    24     NA
"
DF <- read.table(text = Lines, header = TRUE)