4

我有一个 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

4 回答 4

7

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

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

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

于 2013-04-04T12:17:16.037 回答
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
> 
于 2013-04-04T09:31:05.340 回答
1

我刚刚遇到了类似的问题。就我而言,问题在于 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]) 会复制不需要的转换。另外,很抱歉这可能不是最干净/最简洁的代码,我还在学习。)

于 2017-05-27T11:18:10.873 回答
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"
于 2013-04-05T11:27:20.273 回答