以前に複数回正常に実行したコードのセクションを実行していると、理解できない奇妙なエラーが発生します。
### Data Splitting
trainIndex <- createDataPartition(dataset$isTerminated, p = .8,
list = FALSE,
times = 1)
head(trainIndex)
# Step 2: Create the training and testing datasets
testData <- dataset[-trainIndex, ]
trainingData <- dataset[trainIndex, ]
testData <- dataset[-trainIndex, ]
は問題なく動作しますが、trainingData <- dataset[trainIndex, ]
を実行するとError:
imust have one dimension, not 2.
のエラーが発生します
https://topepo.github.io/caret/data-splitting.html に対してコードをチェックしましたが、一致します。他の誰かがそれに遭遇し、解決策を見つけましたか?
コードはdata.frameに対して機能します。
library(caret)
dataset = data.frame(isTerminated=sample(0:1,100,replace=TRUE),
value=runif(100))
trainIndex <- createDataPartition(dataset$isTerminated, p = .8,
list = FALSE,
times = 1)
testData <- dataset[-trainIndex, ]
trainingData <- dataset[trainIndex, ]
trainIndex
は行列であり、行列のサブセット化はdata.framesと行列に対して機能します。あなたが持っているのはティブルです:
library(tibble)
dataset = tibble(dataset)
dataset[trainIndex,]
Error: `i` must have one dimension, not 2.
-trainIndexを追加するとうまくいく理由がまったくわかりません。ベクトルに変換すると、うまくいくこともわかります。
dataset[c(trainIndex),]
# A tibble: 80 x 2
isTerminated value
<int> <dbl>
1 0 0.412
2 1 0.488
3 1 0.395
4 0 0.212
5 0 0.0229
6 0 0.0395
7 0 0.883
8 0 0.601
9 0 0.524
10 0 0.998
# … with 70 more rows
うまくいけば、どういうわけかティブルに精通すれば欠けてしまうかもしれませんが、そうです、それがdata.frameであるか、ティブルであるかは、最終的にはわかっています。
以前に機能していたコードでも同じエラーが発生するため、これは回帰のように見えます。
# df is a tibble
t <- df[df[, 'condition'] == 'foo','t'][[1]][[1]]
Error: `i` must have one dimension, not 2.
他の人が言ったように、回避策はティブルをデータフレームに変換することです:
df <- as.data.frame(df)
t <- df[df[, 'condition'] == 'foo','t'][[1]][[1]]
この種の逆参照がティブルで機能するはずなのか、これが最近のティブルコードのバグなのかはわかりません。どちらにしても、エラーメッセージはあまり役に立ちません。 「データフレームでのみ可能なティブルで何かをしようとしている」のようなもの。方が良いだろう。