2013-04-04 30 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])将复制不必要的转换也。 ,道歉,这可能不是最干净/最简洁的代码,我还在学习。)