我试图读取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"   

请参阅量列包含字符的数据,但预期是数字。这有什么错我的代码?

有帮助吗?

解决方案

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

其他提示

您不能在动物园或XTS对象混合数字和字符数据;然而,如果名称列不旨在是时间序列数据,而是旨在多个时间序列之间进行区分,一个用于为test1,一个用于TEST2,等,然后就可以在第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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top