2013-07-02 71 views
5

我對動物園中的列名有疑問。我通常從數據框中創建動物園對象,並從數據框中選取一列作爲動物園列。我發現的是,如果我只向動物園對象指定一列,那麼動物園不會採用列名。這是否意味着它不被視爲動物園的「專欄」?單列對象的動物園列名

這是一個例子,我通常是這樣做的,有一列和兩列。

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" 

難道我錯過了什麼?

回答

4

這是[默認行爲與陣列或數據幀時使用;空的尺寸是下降。考慮

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

在這種情況下的1列數據幀不需要關於它是柱,並因此ř丟棄該信息,並返回列的內容作爲一個數字信息(在這種情況下)載體,如上所見。該向量沒有colname屬性,因此動物園沒有任何用處。

一個解決方案是使用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 

現在閱讀?'['瞭解更多詳情。

+0

謝謝!我不知道專欄可以那麼複雜。那麼,現在看來很簡單,有了這個解釋。 – ery

5

此行爲不是由於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" 
+0

謝謝! x [2]是一個很棒的快捷方式。 – ery

+1

@ery只是要小心,因爲矩陣/動物園對象不同於data.frame。 'zy [2]'選擇第二行,而不是第二列。 – GSee