【问题标题】:zoo column name for single column object单列对象的动物园列名
【发布时间】:2013-07-02 15:13:34
【问题描述】:

我对动物园中的列名有疑问。我通常从数据框中创建动物园对象,然后从数据框中选择列作为动物园列。我发现,如果我只为 zoo 对象指定一列,那么该列名将不会被 zoo。这是否意味着它在动物园中不被视为“列”?

这是一个我通常如何做的例子,一列和两列。

Lines.1 = "Index,dbt
2008-08-20 15:03:18,88.74
2008-08-20 15:08:18,88.74
2008-08-20 15:13:18,86.56
2008-08-20 15:18:18,85.82"

Lines.2 = "Index,dbt,rh
2008-08-20 15:03:18,88.74,18.25
2008-08-20 15:08:18,88.74,17.25
2008-08-20 15:13:18,86.56,18.75
2008-08-20 15:18:18,85.82,19.75"

x =read.table(text = Lines.1, header = TRUE, sep = ",")
y =read.table(text = Lines.2, header = TRUE, sep = ",")

colnames(x)
colnames(y)

library(zoo)
zx = zoo(x[,2], as.POSIXct(x$Index, tz="GMT"))
zy = zoo(y[,2:3], as.POSIXct(y$Index, tz="GMT"))

colnames(zx)
colnames(zy)

结果如下:

> colnames(zx)
NULL
> colnames(zy)
[1] "dbt" "rh" 

我错过了什么吗?

【问题讨论】:

    标签: r zoo


    【解决方案1】:

    这是[ 与数组或数据框一起使用时的默认行为;空维度被删除。考虑

    > x[, 2]
    [1] 88.74 88.74 86.56 85.82
    > class(x[,2])
    [1] "numeric"
    > is.data.frame(x[,2])
    [1] FALSE
    

    在这种情况下,1 列数据框不需要关于它是哪一列的信息,因此 R 会删除该信息并将列的内容作为数字(在这种情况下)向量返回,如上所示.该向量没有 colname 属性,因此 zoo 无法使用。

    一种解决方案是在索引x[, 2, drop = FALSE] 中使用drop = FALSE,如

    > zx <- zoo(x[, 2, drop = FALSE], as.POSIXct(x$Index, tz="GMT"))
    > zx
                          dbt
    2008-08-20 15:03:18 88.74
    2008-08-20 15:08:18 88.74
    2008-08-20 15:13:18 86.56
    2008-08-20 15:18:18 85.82
    

    要了解其工作原理/方式,请查看

    > x[, 2, drop = FALSE]
        dbt
    1 88.74
    2 88.74
    3 86.56
    4 85.82
    > is.data.frame(x[, 2, drop = FALSE])
    [1] TRUE
    

    并注意在[ 索引中使用默认值 (TRUE) 时缺少 colnames

    > colnames(x[, 2, drop = FALSE])
    [1] "dbt"
    > colnames(x[, 2, drop = TRUE])
    NULL
    

    现在阅读?'['了解更多详情。

    【讨论】:

    • 谢谢!我不知道专栏会这么复杂。好吧,有了这个解释,现在看起来很简单。
    【解决方案2】:

    此行为不是由于zoox[,2] 不返回数据帧,而是返回向量。因此,没有列,也没有列名。

    x[,2]
    [1] 88.74 88.74 86.56 85.82
    

    如果要返回单列数据框,可以使用不带逗号的x[2]x[,2, drop = FALSE]

    x[2]
        dbt
    1 88.74
    2 88.74
    3 86.56
    4 85.82
    
    x[,2, drop = FALSE]
        dbt
    1 88.74
    2 88.74
    3 86.56
    4 85.82
    

    drop 的默认值为TRUE。这意味着单列数据框会自动转换为向量。

    现在,它可以工作了:

    zx <- zoo(x[2], as.POSIXct(x$Index, tz="GMT"))
    colnames(zx)
    [1] "dbt"
    

    【讨论】:

    • 谢谢! x[2] 是一个很好的捷径。
    • @ery 只是要小心,因为矩阵/动物园对象与 data.frame 不同。 zy[2] 选择第二行,而不是第二列。
    猜你喜欢
    • 1970-01-01
    • 2020-01-19
    • 2016-06-11
    • 1970-01-01
    • 2012-02-27
    • 2011-12-14
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多