これは StackOverflow に対する私の最初の質問です。説明を求めて高低を検索しましたが、答えが見つからないようです。要するに、私が使用している関係演算子 ('<=') は、期待どおりのものを生成していません。
> data[['Open']][2]
[1] 79.22
> data[['Avg']][2]
[1] 79.22
> data[['Open']][2] >= data[['Avg']][2]
[1] FALSE
目標は次のとおりです。データをデータ フレームに読み込みます。昨日の高値、安値、終値の平均を取る; そして、今日の始値を昨日の平均と比較します。
大規模なデータに対してスクリプトを実行した後、R での結果が Excel で実行された同様の分析と一致しないことがわかりました。
StackOverflow コミュニティのために、私は問題を本質的な部分に縮小しました。しかし、私のエラーはデータの読み取り方法にある可能性があるため、コードのその部分も含めました。
テスト ファイル ('test.csv') は次のようになり、最後の行の最後に新しい行が追加されます。
<TICKER>,<DATE>,<TIME>,<OPEN>,<LOW>,<HIGH>,<CLOSE>
USDJPY,20120713,0:00:00,79.26,79.05,79.37,79.24
USDJPY,20120716,0:00:00,79.22,78.67,79.23,78.84
私のコード:
# Read in test file
raw <- read.csv('test.csv', header=TRUE, sep=",")
# Convert date and dump data into data frame, date is formatted for time series
stripday <- strptime(raw$X.DATE, format="%Y%m%d")
data <- data.frame(stripday, raw)
# Drop unused data columns and name the used columns
drops <- c("X.DATE.", "X.TIME.", "X.TICKER.")
data <- data[, !(names(data) %in% drops)]
colnames(data) <- c("Date", "Open", "Low", "High", "Close")
# Convert values from facotors to numeric
data[,2] <- as.numeric(as.character(data[,2]))
data[,3] <- as.numeric(as.character(data[,3]))
data[,4] <- as.numeric(as.character(data[,4]))
data[,5] <- as.numeric(as.character(data[,5]))
# Take yesterday's average of High, Low, and Close
data[['Avg']] <- NA
data[['Avg']][2] <- (
data[['High']][1] +
data[['Low']][1] +
data[['Close']][1]) / 3
# Is today's Open greater than or equal to yesterday's Average
data[['OpenGreaterThanAvg']] <- NA
data[['OpenGreaterThanAvg']] <- 1 * (data[['Open']] >= data[['Avg']])
# Write data to .csv
write.table(data, 'output.csv', quote=FALSE, sep=",", row.names=FALSE)
79.22 は 79.22 に等しいので、OpenGreaterThanAvg はゼロではなく「1」を表示すると思います。
str() と class() は、比較しようとしている 2 つのオブジェクトが同じであることを教えてくれます。
> str(data[['Open']][2])
num 79.2
> str(data[['Avg']][2])
num 79.2
> class(data[['Open']][2])
[1] "numeric"
> class(data[['Avg']][2])
[1] "numeric"
また、R は data[['Avg']][2] が data[['Open']][2] より小さいことを教えてくれることに注意してください。
> data[['Open']][2] < data[['Avg']][2]
[1] TRUE
さらに、私は建設的な批判の大ファンです。ですから、質問とは関係のない提案があれば、コメントを歓迎します。
ありがとうございました。ブライアン