我对动物园中的列名有疑问。我通常从数据框创建zoo对象,然后从数据框中选择列作为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"
我错过了什么吗?
答案 0 :(得分:7)
此行为不是由zoo
引起的。 x[,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"
答案 1 :(得分:6)
当与数组或数据帧一起使用时,这是[
的默认行为;空白维度已弃用。考虑
> 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 无法使用。
解决方案是在索引drop = FALSE
中使用x[, 2, 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
请注意colnames
索引中使用默认值TRUE
时缺少[
:
> colnames(x[, 2, drop = FALSE])
[1] "dbt"
> colnames(x[, 2, drop = TRUE])
NULL
现在阅读?'['
了解更多详情。