在R中从CSV文件读取xts数据

5

我正在尝试从CSV文件中读取时间序列,并将它们保存为xts,以便能够使用quantmod进行处理。问题是数值无法被解析。

CSV文件:

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

代码:

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"   

看到金额列包含字符数据,但预期应该是数字。我的代码有什么问题?

2个回答

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)
})

1
我应该使用哪种结构来从CSV中读取数据,然后能够创建只包含数字数据的zoo?谢谢。 - Stas
1
你能推荐一些好的 R 书吗?似乎我需要一些阅读材料来开始学习。 - Stas
2
@user194635:关于你的第二个问题,看看我的编辑就能找到答案了。至于好的 R 书籍:在 SO 上搜索 ([r] [books]),你会找到很多答案。 - Joshua Ulrich

1

你不能在zoo或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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接