2013-04-04 97 views
3

我使用XTS轉換數據幀字符

banknifty <- as.xts(read.zoo("banknifty.csv",sep=",",tz="" ,header=T)) 

read.zoo()提取與數值的數據幀,但爲我申請as.xts(),將data. frame的數值得到轉換爲字符csv文件,並提取數據。

# banknifty[1,] gives 
2008-01-01 09.34:00 "10" "12" "13" 

我想as.xts應該返回data.frame與數值。 如何避免此問題?

+0

'read.zoo'(內部read.table)應該直接爲您提供數值。您需要在問題中添加一些csv文件,以瞭解爲什麼這不適合您。 – agstudy 2013-04-04 09:54:45

回答

1

使用as.numeric和你的代碼將是:

> data.in <- as.xts(read.zoo("banknifty.csv",sep=",",tz="" ,header=T); 


> sapply(c(1:4), function(n) { data.in[,n] <- as.numeric(data.in[,n]) }, simplify=TRUE) 
     [,1] [,2] [,3] [,4] 
[1,] 6032.25 6040.50 6032.17 6036.29 
[2,] 6036.29 6036.29 6020.00 6025.05 
[3,] 6025.05 6026.00 6020.10 6023.12 
[4,] 6023.12 6034.45 6022.73 6034.45 
[5,] 6034.45 6034.45 6030.00 6030.00 
[6,] 6030.00 6038.00 6028.25 6038.00 
> data.in 
         V2  V3  V4  V5 
2007-01-02 10:00:00 6032.25 6040.50 6032.17 6036.29 
2007-01-02 10:05:00 6036.29 6036.29 6020.00 6025.05 
2007-01-02 10:10:00 6025.05 6026.00 6020.10 6023.12 
2007-01-02 10:15:00 6023.12 6034.45 6022.73 6034.45 
2007-01-02 10:20:00 6034.45 6034.45 6030.00 6030.00 
2007-01-02 10:25:00 6030.00 6038.00 6028.25 6038.00 
> 
+0

它給了我一個錯誤:'lapply錯誤(c(1:ncol(banknifty)),函數(列){: 維數不正確 另外:警告信息: 1:在as.double.xts(banknifty強制引入NAs 2:在as.double.xts(banknifty [,列])中:通過強制引入NAs 3:在as.double.xts(banknifty [,column])中:引入了NAs通過強制 4:在as.double.xts(banknifty [,列]):通過強制引入的NAs – user1177819 2013-04-04 09:41:31

+0

而不是1:ncol(banknifty),只指定那些要轉換的列 – hd1 2013-04-04 09:50:20

+0

我更改1:ncol )到c(1:4),但仍然不起作用。給我提供與上面相同的錯誤 – user1177819 2013-04-04 10:14:35

3

你感到困惑XTS /動物園物體的性質。它們是具有有序索引屬性的矩陣,因此不能像在data.frame中那樣混合xts/zoo對象中的類型。

對象被轉換爲字符的原因是因爲文件中的某些值不是數字。這也是爲什麼當您嘗試hd1's解決方案時,您會收到NAs introduced by coercion錯誤。

因此,您的問題的答案是「修復您的CSV文件」,但我們不能幫助您解決它,除非您向我們顯示文件的內容。

0
> sapply(c(1:4), function(n) { data.in[,n] <- as.numeric(data.in[,n]) }, simplify=TRUE) 

此命令不會對data.in進行任何更改。它以相同的格式返回數據報價

> data.in 
         V2  V3  V4  V5 
2007-01-02 10:00:00 "6032.25" "6040.50" "6032.17" "6036.29" 
2007-01-02 10:05:00 "6036.29" "6036.29" "6020.00" "6025.05" 
2007-01-02 10:10:00 "6025.05" "6026.00" "6020.10" "6023.12" 
0

我剛碰到類似的問題。在我的情況下,問題是as.xts()函數試圖將日期列與數字列一起轉換。由於R不會將日期視爲數值,因此會自動將整個數據框轉換爲字符。我假設也發生在你的例子中(你可以使用你的.csv文件來檢查這個)。

這樣的事情應該幫助:

data.in <- read.csv("banknifty.csv",sep=",",header=T) 
data.in[,1] <- format(as.Date(data.in[,1]), format="%Y-%m-%d", tz="GMT", usetz=TRUE) #change tz to whatever applies 
data.in[,1] <- as.POSIXct(data.in[,1], "GMT") 
data.ts <- xts(data.in[,c(2,3,4,5)], order.by = data.in[,1]) 

(請注意,data.ts < - XTS(data.in,order.by = data.in [,1])將複製不必要的轉換也。 ,道歉,這可能不是最乾淨/最簡潔的代碼,我還在學習。)