2010-09-30 157 views
4

我試圖從CSV文件中讀取時間序列,並將它們保存爲xts,以便能夠使用quantmod進行處理。問題是數值不被解析。從R CSV文件中讀取xts

CSV文件:

name;amount;datetime 
test1;3;2010-09-23 19:00:00.057 
test2;9;2010-09-23 19:00:00.073 

R代碼裏面:

library(xts) 
ColClasses = c("character", "numeric", "character") 
Data <- read.zoo("c:\\dat\\test2.csv", index.column = 3, sep = ";", header = TRUE, FUN = as.POSIXct, colClasses = ColClasses) 
as.xts(Data) 

結果:

    name amount 
2010-09-23 19:00:00 "test1" "3" 
2010-09-23 19:00:00 "test2" "9" 

見量列包含字符的數據,但預期是數字。我的代碼有什麼問題?

回答

8

zooxts的內部數據結構是matrix,所以您不能混合數據類型。


只需讀取的數據與read.table

Data <- read.table("file.csv", sep=";", header=TRUE, colClasses=ColClasses) 

我注意到你的數據有亞秒,所以你可能感興趣的xts::align.time。此代碼將採用Data,並以秒爲單位爲每個"name"創建一個對象。

NewData <- do.call(merge, lapply(split(Data,Data$name), function(x) { 
    align.time(xts(x[,"amount"],as.POSIXct(x[,"datetime"])), n=1) 
})) 

如果你想創建一個在您的全球環境中的對象test1test2,你可以這樣做:

lapply(split(Data,Data$name), function(x) { 
    assign(x[,"name"], xts(x[,"amount"],as.POSIXct(x[,"datetime"])),envir=.GlobalEnv) 
}) 
+0

這就是爲什麼它的工作沒有名稱列!!!! – Stas 2010-09-30 13:45:59

+0

我應該使用哪種結構從CSV中讀取數據,然後才能使用數字數據創建動物園?謝謝 – Stas 2010-09-30 13:48:18

+1

你能推薦一些好的R書嗎?看來我需要一些東西來讀一開始。 – Stas 2010-09-30 13:49:44

1

不能混合在動物園或XTS對象數字和字符數據;然而,如果名稱列不是時間序列數據,而是爲了區分多個時間序列,一個用於test1,一個用於test2等,那麼您可以使用split = 1在第1列上進行拆分,從而導致這樣的拆分如下面的代碼所示。一定要設置digits.secs,否則你不會看到輸出的子秒(雖然他們會在任何情況下存在):

options(digits.secs = 3) 
z <- read.zoo("myfile.csv", sep = ";", split = 1, index = 3, header = TRUE, tz = "") 
x <- as.xts(z)