2011-11-21 37 views
2

我使用zoo包中的R,分析時間序列數據的因素默認情況下。我有以下數據文件:停止數據被讀取作爲與read.zoo

Date(dd-mm-yy),Time(hh:mm:ss),Julian_Day,AOT_1640,AOT_1020,AOT_870,AOT_675,AOT_667,AOT_555,AOT_551,AOT_532,AOT_531,AOT_500,AOT_490,AOT_443,AOT_440,AOT_412,AOT_380,AOT_340,Water(cm),%TripletVar_1640,%TripletVar_1020,%TripletVar_870,%TripletVar_675,%TripletVar_667,%TripletVar_555,%TripletVar_551,%TripletVar_532,%TripletVar_531,%TripletVar_500,%TripletVar_490,%TripletVar_443,%TripletVar_440,%TripletVar_412,%TripletVar_380,%TripletVar_340,%WaterError,440-870Angstrom,380-500Angstrom,440-675Angstrom,500-870Angstrom,340-440Angstrom,440-675Angstrom(Polar),Last_Processing_Date(dd/mm/yyyy),Solar_Zenith_Angle 
29:03:2011,09:26:28,88.393380,N/A,0.490230,0.553836,0.707512,N/A,N/A,N/A,N/A,N/A,0.911939,N/A,N/A,0.984430,N/A,1.046517,1.081283,1.632430,N/A,4.597345,4.551429,3.216097,N/A,N/A,N/A,N/A,N/A,2.587552,N/A,N/A,2.694179,N/A,2.085042,2.522511,2.309844,0.851964,0.497006,0.789257,0.898093,0.362423,N/A,13/04/2011,58.822462 
29:03:2011,09:41:28,88.403796,N/A,0.440362,0.513093,0.676703,N/A,N/A,N/A,N/A,N/A,0.893867,N/A,N/A,0.965588,N/A,1.034943,1.079975,1.654521,N/A,12.867837,12.687550,11.037238,N/A,N/A,N/A,N/A,N/A,9.345739,N/A,N/A,8.423888,N/A,8.421787,9.334135,1.622026,0.937815,0.529939,0.852553,0.999260,0.431102,N/A,13/04/2011,57.070624 
29:03:2011,10:11:29,88.424641,N/A,0.565148,0.654724,0.842142,N/A,N/A,N/A,N/A,N/A,1.070556,N/A,N/A,1.144966,N/A,1.208759,1.242663,1.666760,N/A,9.933505,9.499251,8.327355,N/A,N/A,N/A,N/A,N/A,6.781617,N/A,N/A,6.612952,N/A,5.600500,5.630695,1.302058,0.826713,0.438445,0.736362,0.884554,0.316539,N/A,13/04/2011,53.916620 
29:03:2011,10:17:46,88.429005,N/A,0.593881,0.681572,0.866620,N/A,N/A,N/A,N/A,N/A,1.095508,N/A,N/A,1.168008,N/A,1.233022,1.268572,1.704882,N/A,4.072782,3.752197,3.210935,N/A,N/A,N/A,N/A,N/A,2.389567,N/A,N/A,2.385582,N/A,1.653326,1.015620,0.728711,0.798185,0.427272,0.716165,0.853963,0.319100,N/A,13/04/2011,53.323057 
29:03:2011,10:26:27,88.435035,N/A,0.636627,0.714175,0.884887,N/A,N/A,N/A,N/A,N/A,1.092220,N/A,N/A,1.167024,N/A,1.224264,1.271774,1.626393,N/A,16.400200,10.585139,6.513873,N/A,N/A,N/A,N/A,N/A,3.169704,N/A,N/A,4.085949,N/A,3.963741,8.663229,10.035231,0.724581,0.411533,0.659996,0.764539,0.329073,N/A,13/04/2011,52.544475 

我嘗試使用下面的代碼來閱讀:

f <- function(d, t) as.chron(paste(as.Date(chron(d, format='d:m:y')), t)) 

z = read.zoo("110329_110329_Chilbolton.lev10", sep=',', header=T, index = 1:2, FUN=f, as.is=F, dec=".") 

但所有的數據集的列都被解讀爲因素 - 所以,當我做summary(z)我得到的輸出,如:

X.TripletVar_340 X.WaterError X440.870Angstrom X380.500Angstrom X440.675Angstrom X500.870Angstrom 
1.015620:1  0.728711:1  0.724581:1  0.411533:1  0.659996:1  0.764539:1  
2.522511:1  1.302058:1  0.798185:1  0.427272:1  0.716165:1  0.853963:1  
5.630695:1  1.622026:1  0.826713:1  0.438445:1  0.736362:1  0.884554:1  
8.663229:1  2.309844:1  0.851964:1  0.497006:1  0.789257:1  0.898093:1  
9.334135:1  10.035231:1  0.937815:1  0.529939:1  0.852553:1  0.999260:1  

我怎麼能阻止它讀取數據爲默認的因素?該數據由read.table沒有任何額外的參數讀取罰款告訴它,以確保一切保持原樣不編號的因素 - 那麼爲什麼read.zoo表現不同?

我想我可以使用colClasses來指定每列的類型,但我寧願不這樣做,以防數據集中列的順序發生變化 - 默認情況下將其轉換爲數字,然後嘗試因素如果不起作用會好得多。

任何想法?

回答

2

這已經確診了,不過讓我們補充這使我們有可能在這裏使用的read.zoo語句的例子。

有兩個問題:(1)設備被表示爲N/A,而不是NA所以我們必須告訴它。 (2)倒數第二列不是數字。動物園將數據表示爲矩陣,因此它必須都是數字(因素也支持動物園對象,但它們不能混合使用)。

嘗試此(其中我們已經加入的第二數據線到良好的措施的例子)。請確保使用最新版本的zoo來運行示例數據,因爲text=參數(它指定了數據本身的文本而不是文件名)最近才被添加。另外請注意,從R ?read.zoo給出的幫助和vignette("zoo-read")給出的文件完全致力於read.zoo的例子。

Lines <- "Date(dd-mm-yy),Time(hh:mm:ss),Julian_Day,AOT_1640,AOT_1020,AOT_870,AOT_675,AOT_667,AOT_555,AOT_551,AOT_532,AOT_531,AOT_500,AOT_490,AOT_443,AOT_440,AOT_412,AOT_380,AOT_340,Water(cm),%TripletVar_1640,%TripletVar_1020,%TripletVar_870,%TripletVar_675,%TripletVar_667,%TripletVar_555,%TripletVar_551,%TripletVar_532,%TripletVar_531,%TripletVar_500,%TripletVar_490,%TripletVar_443,%TripletVar_440,%TripletVar_412,%TripletVar_380,%TripletVar_340,%WaterError,440-870Angstrom,380-500Angstrom,440-675Angstrom,500-870Angstrom,340-440Angstrom,440-675Angstrom(Polar),Last_Processing_Date(dd/mm/yyyy),Solar_Zenith_Angle 
29:03:2011,09:26:28,88.393380,N/A,0.490230,0.553836,0.707512,N/A,N/A,N/A,N/A,N/A,0.911939,N/A,N/A,0.984430,N/A,1.046517,1.081283,1.632430,N/A,4.597345,4.551429,3.216097,N/A,N/A,N/A,N/A,N/A,2.587552,N/A,N/A,2.694179,N/A,2.085042,2.522511,2.309844,0.851964,0.497006,0.789257,0.898093,0.362423,N/A,13/04/2011,58.822462 
29:03:2012,09:26:28,88.393380,N/A,0.490230,0.553836,0.707512,N/A,N/A,N/A,N/A,N/A,0.911939,N/A,N/A,0.984430,N/A,1.046517,1.081283,1.632430,N/A,4.597345,4.551429,3.216097,N/A,N/A,N/A,N/A,N/A,2.587552,N/A,N/A,2.694179,N/A,2.085042,2.522511,2.309844,0.851964,0.497006,0.789257,0.898093,0.362423,N/A,13/04/2011,58.822462" 

library(chron) 
library(zoo) 
colClasses <- c("character", "character", rep("numeric", 43)) 
colClasses[44] <- "NULL" # zap the non-numeric column 
z <- read.zoo(text = Lines, header = TRUE, sep = ",", na.strings = "N/A", 
    index = 1:2, colClasses = colClasses, FUN = function(d, t) 
     as.chron(paste(d, t), "%d:%m:%Y %H:%M:%S")) 
1

...read.zoo()將讓你上read.table()傳遞stringsAsFactors = F。這應該夠了吧。

+0

+1請注意,我堅信,TRUE; /'FALSE'應始終以長格式寫的。這很容易聲明一個名爲F的變量,然後可能會導致各種意想不到的事情,其中​​你寫'F'爲'FALSE' – Andrie

+0

感謝您的建議,但似乎沒有工作,我仍然得到所有的數字輸出作爲因素(與上面的輸出沒有差別)。任何其他想法? – robintw

+0

Arg ...對不起羅賓。我無法確定,因爲你的代碼不適合我。我想我錯過了'as.chron'功能。讓我跟蹤它,看看... –

2

你的數據文件構成了read.zoo兩個問題。

首先,它使用N/A來表示缺少的值,而不是字符串NA,其默認值爲read.table()。這可以通過設置na.strings="N/A"來解決。

的第二個問題是數據文件的下一個到最後一列,Last_Processing_Date.dd.mm.yyyy,包含字符串。

但是,根據動物園FAQ文檔(warning, PDF)

A 「動物園」 對象可以是:(1)一個數值向量,(2)一個數字矩陣或(3)的一個因素,但可以 不包含數字向量和因子。

當「問」在一堆同時包含數字字符值的列的讀取,一切都轉換爲因素是,read.zoo()可以產生對象配件的這三個標準中的一個的唯一途徑。

如果刪除有問題的列,並指定缺失值的字符串,一切工作順利。如果您確實需要數字和因子列,則上面鏈接的FAQ提示了幾種可能的方法。

z <- read.table("110329_110329_Chilbolton.lev10", sep=",", header=T, 
       stringsAsFactors=FALSE, na.strings="N/A") 
z$Last_Processing_Date.dd.mm.yyyy. <- NULL 
z <- zoo(x=z[,-1:-2], order.by=f(z[[1]], z[[2]])) 
summary(z) 

    Index      Julian_Day  AOT_1640  AOT_1020  
Min. :(03/29/11 09:26:28) Min. :88.39 Min. : NA Min. :0.4404 
1st Qu.:(03/29/11 09:41:28) 1st Qu.:88.40 1st Qu.: NA 1st Qu.:0.4902 
Median :(03/29/11 10:11:29) Median :88.42 Median : NA Median :0.5651 
Mean :(03/29/11 10:00:44) Mean :88.42 Mean :NaN Mean :0.5452 
3rd Qu.:(03/29/11 10:17:46) 3rd Qu.:88.43 3rd Qu.: NA 3rd Qu.:0.5939 
Max. :(03/29/11 10:26:27) Max. :88.44 Max. : NA Max. :0.6366 
+0

正確...如果你查看'read.zoo()',你會發現數據被as.matrix()強制轉換,如果有任何非數字/邏輯/複合體)列「。 –

2

的問題似乎是,你是從Excel文件導入,而不是花時間,使「N/A」的值到適當的NA值。這導致列被視爲非數字。 zoo軟件包需要將coredata作爲矩陣,並嚴格限制可用於處理的選項。一切都需要數字。即使你放入stringsAsFactors = FALSE,你仍然可以在預期的數字中得到字符列。

如果你讀函數read.table在並設置as.is=TRUE,可以克服的因素的問題。然後您需要強制您希望爲數字的列,並刪除名爲「Last_Processing_Date.dd.mm.yyyy」的尾部日期列。

我會做這個第一:

z = read.table(file.choose(), sep=',', header=T, as.is=TRUE, dec=".") 

,然後選擇列要挾到數字:

z[ , 3:43] <- sapply(z[ , 3:43], as.numeric) 

保持在該日期列完整的44列。然後決定哪些列應該進入動物園對象。

編輯:我看到的Gabor格羅騰迪克已經解決了這些問題,以及這是理所應當的,因爲他是包的作者之一。