web-dev-qa-db-fra.com

Erreur: `i` doit avoir une dimension, pas 2. dans CreateDataPartition dans R

J'exécute une section de code que j'ai exécutée avec succès plusieurs fois auparavant et j'obtiens maintenant une erreur étrange que je ne comprends pas:

### 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, ] fonctionne bien, mais quand je lance trainingData <- dataset[trainIndex, ] me donne une erreur de Error:jemust have one dimension, not 2.

J'ai vérifié le code contre https://topepo.github.io/caret/data-splitting.html et il correspond. Est-ce que quelqu'un d'autre l'a rencontré et a trouvé une solution?

3
Chris

Le code fonctionne pour un 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 est une matrice et le sous-ensemble avec une matrice fonctionne pour les data.frames et les matrices. Ce que vous avez est un tibble:

library(tibble)
dataset = tibble(dataset)
dataset[trainIndex,]
Error: `i` must have one dimension, not 2.

Je n'ai vraiment aucune idée de la raison pour laquelle l'ajout de -trainIndex fonctionnerait. Vous pouvez voir que cela fonctionne également si vous le convertissez en vecteur:

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

Espérons que d'une manière ou d'une autre, plus familiarisé avec le tibble puisse participer, mais oui, en fin de compte, il faut savoir s'il s'agit d'un data.frame ou d'un tibble.

1
StupidWolf

Cela me ressemble à une régression, car j'ai également la même erreur avec du code qui fonctionnait auparavant.

# df is a tibble
t <- df[df[, 'condition'] == 'foo','t'][[1]][[1]]

Error: `i` must have one dimension, not 2.

Comme d'autres l'ont dit, la solution de contournement consiste à convertir le tibble en une trame de données:

df <- as.data.frame(df)
t <- df[df[, 'condition'] == 'foo','t'][[1]][[1]]

Je ne sais pas si ce type de déréférencement est censé fonctionner avec des tibbles, ou s'il s'agit d'un bogue dans le code tibble récent. Quoi qu'il en soit, le message d'erreur n'est pas très utile. Quelque chose comme "Vous essayez de faire quelque chose avec un tibble qui n'est possible qu'avec un bloc de données." serait mieux.

0
Paul