2012-09-04 36 views
2

我有一個動物園時間序列動物園時間序列,稱爲merged非數值參數二元運算誤差與R中

merged <- structure(c("53736", "53736", "53737", "53737", "53738", "53738", 
"2353.96", "2377.84", "2388.4", "2397.52", "2432.62", "2407.52", 
"68.1", "71.4", "68.2", "75.3", "107.5", "80.3", "10.6", "11.1", 
"10.6", "11.7", "16.8", "12.5", "2006-01-01 11:17:00", "2006-01-01 23:15:00", 
"2006-01-02 11:17:00", "2006-01-02 23:15:00", "2006-01-03 11:16:00", 
"2006-01-03 23:17:00", "11.206564", "13.019471", "11.784637", 
"14.039267", "18.505121", "15.057849"), .Dim = c(6L, 6L), .Dimnames = list(
    NULL, c("station_id", "ztd", "zwd", "iwv", "timestamp", "pwc" 
    )), index = structure(c(1136113200, 1136156400, 1136199600, 
1136242800, 1136286000, 1136329200), class = c("POSIXct", "POSIXt" 
)), class = "zoo") 

望着結構,我們可以看到,它有一些列的:

> str(merged) 
‘zoo’ series from 2006-01-01 11:00:00 to 2010-03-24 23:00:00 
    Data: chr [1:2966, 1:6] "53736" "53736" "53737" "53737" "53738" "53738" "53739" ... 
- attr(*, "dimnames")=List of 2 
    ..$ : NULL 
    ..$ : chr [1:6] "station_id" "ztd" "zwd" "iwv" ... 
    Index: POSIXct[1:2966], format: "2006-01-01 11:00:00" "2006-01-01 23:00:00" "2006-01-02 11:00:00" ... 

但是,如果我嘗試創建與其他一些列的數學運算的新列,這是行不通的:

> merged$error <- merged$pwc - merged$iwv 
Error in `-.default`(merged$pwc, merged$iwv) : 
    non-numeric argument to binary operator 

我確信我以前做過這件事,它已經工作了,所以我無法弄清楚我做錯了什麼。有沒有人有任何想法?

+4

您的數據屬於'character'類而不是'numeric'類。 '-'沒有爲'character'定義。 – James

+1

還要注意'zoo'對象的coredata是一個矩陣,這意味着所有的數據必須是相同的類型。所以,如果你想要一個數字'動物園'對象,你將不得不擺脫'timestamp'列(這可以是索引呢?) – seancarmody

+0

當你讀入數據時可能會出現這個問題。看看'?read.zoo'。此外,還有一個關於可通過vignette(「動物園閱讀」)訪問的'read.zoo'的小插件。 –

回答

6

正如在評論中提到的那樣:您的數據是字符,而不是數字,並且-未定義用於字符向量。他們全部是角色的原因是因爲timestamp列以及動物園對象是具有索引屬性的矩陣(並且不能混合矩陣中的類型)。

因此,您需要將merged的相關列轉換爲數字。

merged2 <- merged[,!grepl("timestamp",colnames(merged))] 
merged2 <- zoo(apply(merged2,2,type.convert), index(merged)) 
merged2$error <- merged2$pwc - merged2$iwv 
相關問題