web-dev-qa-db-ja.com

エラー:RのCreateDataPartitionでは、 `i`は2ではなく1次元でなければなりません

以前に複数回正常に実行したコードのセクションを実行していると、理解できない奇妙なエラーが発生します。

### 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 に対してコードをチェックしましたが、一致します。他の誰かがそれに遭遇し、解決策を見つけましたか?

3
Chris

コードは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であるか、ティブルであるかは、最終的にはわかっています。

1
StupidWolf

以前に機能していたコードでも同じエラーが発生するため、これは回帰のように見えます。

# 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]]

この種の逆参照がティブルで機能するはずなのか、これが最近のティブルコードのバグなのかはわかりません。どちらにしても、エラーメッセージはあまり役に立ちません。 「データフレームでのみ可能なティブルで何かをしようとしている」のようなもの。方が良いだろう。

0
Paul