我正在尝试从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
R代码:
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"
请参阅amount列包含字符数据但预计为数字。我的代码出了什么问题?
答案 0 :(得分:8)
zoo
和xts
的内部数据结构均为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 )
}) )
如果要在全局环境中创建对象test1
和test2
,可以执行以下操作:
lapply( split(Data,Data$name), function(x) {
assign(x[,"name"], xts(x[,"amount"],as.POSIXct(x[,"datetime"])),envir=.GlobalEnv)
})
答案 1 :(得分:1)
您不能在动物园或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)