前提・実現したいこと
カラムが2つあるデータフレームがあります。
1つは機械学習モデルが予測した「成功確率」(expect)でもうひとつが
実際に成功したかのフラグ(flg)です。
(成功の場合1,失敗の場合0)
この、データに対してexpectが「0%以上の場合」「5%以上の場合」「10%以上の場合」
と5%ずつ閾値をおいて、Xが閾値以上のデータのみを集計したい。
発生している問題
はじめこの処理を以下のように書いていました。
R
1for(n in seq(0,1,0.05)){ 2data2 <- data$flg[data&expect >= n] 3 処理 4}
しかし、このfor文の書き方では、なぜかところどころうまくいきません。
例えば「15%以上」で区切った処理結果が「20%以上」で区切った処理結果と同じになっていたり
「70%以上」で区切った処理結果が「75%以上」で区切った処理結果と同じになっていたりします。
なぜか処理が飛んでいるというか、全てではなくところどころ隣と同じ結果になってしまう現象になってしまっていました。
(抽象的な書き方ですみません。。。)
試したこと
はじめはデータのほうがおかしくてうまくマッチングできていないのかと思いましたが、
特に問題は見当たりませんでした。
結局以下のように書き直すことで正常に処理されるようになりました。
R
1num <- c(1,0.05,0.1,0.15.0.2....) 2for(n in num){ 3data2 <- data$flg[data&expect >= n] 4 処理 5}
typeofで見るとデータ型も両方double型でしたし、seq()で作ったベクトルとc()で手入力したベクトルの何が違うのかわかりません。。。
イテレータにseqを使うのはナンセンスなのでしょうか。。。
このままでは、今後ビビってseqを使えないため、
問題が発生した原因がわかる方いらっしゃいましたらご教示願いたいです。
環境
sessionInfo()の出力結果は以下の通りです。
R version 3.5.1 (2018-07-02)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)
Matrix products: default
locale:
[1] LC_COLLATE=Japanese_Japan.932 LC_CTYPE=Japanese_Japan.932
[3] LC_MONETARY=Japanese_Japan.932 LC_NUMERIC=C
[5] LC_TIME=Japanese_Japan.932
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] compiler_3.5.1 tools_3.5.1