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

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 列に文字データが含まれていますが、数値である必要があります。コードの何が問題になっていますか?

4

2 に答える 2

8

zooとの両方の内部データ構造xtsmatrixであるため、データ型を混在させることはできません。


次のようにデータを読み込んでくださいread.table

Data <- read.table("file.csv", sep=";", header=TRUE, colClasses=ColClasses)

あなたのデータにはサブセカンドがあるので、興味があるかもしれませんxts::align.time。このコードは、秒単位Dataで1つの列を持つ1つのオブジェクトを取得して作成します"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)
})
于 2010-09-30T13:42:24.757 に答える
1

Zoo または xts オブジェクトに数値データと文字データを混在させることはできません。ただし、name 列が時系列データではなく、複数の時系列 (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)
于 2010-10-01T04:17:15.867 に答える