web-dev-qa-db-fra.com

Erreur - remplacement a [x] lignes, les données ont [y]

J'ai une colonne numérique ("valeur") dans un cadre de données ("df") et j'aimerais générer une nouvelle colonne ("valueBin") basée sur "valeur". J'ai le code conditionnel suivant pour définir df $ valueBin:

df$valueBin[which(df$value<=250)] <- "<=250"
df$valueBin[which(df$value>250 & df$value<=500)] <- "250-500"
df$valueBin[which(df$value>500 & df$value<=1000)] <- "500-1,000"
df$valueBin[which(df$value>1000 & df$value<=2000)] <- "1,000 - 2,000"
df$valueBin[which(df$value>2000)] <- ">2,000"

Je reçois l'erreur suivante:

"Erreur dans $<-.data.frame (*tmp*," ValueBin ", valeur = c (NA, NA, NA,: le remplacement a 6530 lignes, les données ont 6532"

Chaque élément de df$value Doit tenir dans une de mes déclarations which(). Il ne manque aucune valeur dans df$value. Bien que, même si je n’exécute que la première instruction conditionnelle (<= 250), j’obtiens exactement la même erreur, avec "...replacement has 6530 rows..." Bien qu’il y ait beaucoup moins de 6530 enregistrements avec une valeur <= 250, et la valeur n’est jamais NA.

Ce lien SO note une erreur similaire lors de l’utilisation de aggreg () était un bogue, mais il recommande d’installer la version de RI. De plus, le rapport de bogue indique qu’il a été corrigé. R erreur globale: "le remplacement a <foo> lignes, les données ont <bar>"

Ce lien SO semble davantage lié à mon problème. Il s’agissait d’un problème lié à sa logique conditionnelle qui générait moins d’éléments du tableau de remplacement. Je suppose que cela doit être mon problème. problème aussi, et a pensé au début que je devais avoir un "<=" au lieu d'un "<" ou vice versa, mais après vérification, je suis presque sûr qu'ils sont tous corrects pour couvrir chaque valeur de "valeur" sans chevauchement. Erreur R dans '[<-. Data.frame' ... le remplacement a # éléments, besoin de #

31
Max Power

Vous pouvez utiliser cut

 df$valueBin <- cut(df$value, c(-Inf, 250, 500, 1000, 2000, Inf), 
    labels=c('<=250', '250-500', '500-1,000', '1,000-2,000', '>2,000'))

les données

 set.seed(24)
 df <- data.frame(value= sample(0:2500, 100, replace=TRUE))
15
akrun

La réponse de @akrun fait certainement l'affaire. Pour les futurs googleurs qui veulent comprendre pourquoi, voici une explication ...

La nouvelle variable doit être créée en premier.

La variable "valueBin" doit être déjà dans le df pour que l'affectation conditionnelle fonctionne. Essentiellement, la syntaxe du code est correcte. Ajoutez juste une ligne devant le mandrin de code pour créer ce nom -

df$newVariableName <- NA

Ensuite, vous continuez avec les règles d’affectation conditionnelles que vous avez, comme

df$newVariableName[which(df$oldVariableName<=250)] <- "<=250"

Je blâme quiconque a écrit le message d'erreur de ce paquet ... Le débogage a été rendu particulièrement déroutant par ce message d'erreur. Il n’est pas pertinent que vous disposiez de deux tableaux dans le df avec des longueurs différentes. Non. Créez simplement la nouvelle colonne en premier. Pour plus de détails, consultez cet article https://www.r-bloggers.com/translating-weird-r-errors/

46
RachelSunny