xts将数据帧转换为字符

时间:2013-04-04 09:25:35

标签: r xts

我有一个csv文件并使用

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

read.zoo()使用数值提取数据框,但在我应用as.xts()时,data. frame的数值会转换为字符。

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

我希望as.xts应该使用数值返回data.frame。 如何避免这个问题?

4 个答案:

答案 0 :(得分:6)

你对xts / zoo对象的本质感到困惑。它们是具有有序索引属性的矩阵,因此您不能像在data.frame中那样在xts / zoo对象中混合类型。

将对象转换为字符的原因是因为文件中的某些值不是数字。这也是您在尝试hd1's解决方案时遇到NAs introduced by coercion错误的原因。

因此,您的问题的答案是“修复您的CSV文件”,但除非您向我们展示文件的内容,否则我们无法帮助您解决问题。

答案 1 :(得分: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
> 

答案 2 :(得分: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"

答案 3 :(得分: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&lt; - xts(data.in,order.by = data.in [,1])会复制不需要的转换。此外,道歉这可能不是最干净/最简洁的代码,我还在学习。)