Message d'avertissement: Dans «…»: niveau de facteur invalide, NA généré


135

Je ne comprends pas pourquoi j'ai reçu ce message d'avertissement.

> fixed <- data.frame("Type" = character(3), "Amount" = numeric(3))
> fixed[1, ] <- c("lunch", 100)
Warning message:
In `[<-.factor`(`*tmp*`, iseq, value = "lunch") :
  invalid factor level, NA generated
> fixed
  Type Amount
1 <NA>    100
2           0
3           0

Réponses:


216

Le message d'avertissement est dû au fait que votre variable «Type» a été définie comme un facteur et que «déjeuner» n'était pas un niveau défini. Utilisez le stringsAsFactors = FALSEdrapeau lors de la création de votre bloc de données pour forcer "Type" à être un caractère.

> fixed <- data.frame("Type" = character(3), "Amount" = numeric(3))
> str(fixed)
'data.frame':   3 obs. of  2 variables:
 $ Type  : Factor w/ 1 level "": NA 1 1
 $ Amount: chr  "100" "0" "0"
> 
> fixed <- data.frame("Type" = character(3), "Amount" = numeric(3),stringsAsFactors=FALSE)
> fixed[1, ] <- c("lunch", 100)
> str(fixed)
'data.frame':   3 obs. of  2 variables:
 $ Type  : chr  "lunch" "" ""
 $ Amount: chr  "100" "0" "0"

1
@David Pourquoi R le convertit-il en facteur?
KannarKK

1
Parce que c'est le paramètre par défaut dans la data.frame()fonction (et c'est par défaut car c'est ce que la plupart des utilisateurs veulent la grande majorité du temps).
David

46

Si vous lisez directement à partir d'un fichier CSV, procédez comme suit.

myDataFrame <- read.csv("path/to/file.csv", header = TRUE, stringsAsFactors = FALSE)

stringAsFactors lance une erreur: argument non utilisé (stringAsFactors = FALSE)
Coliban

1
stringsAsFactors- stringsdoit être pluriel (@Coliban)
campeterson

24

Voici une approche flexible , elle peut être utilisée dans tous les cas, notamment:

  1. à affecter une seule colonne , ou
  2. le dataframea été obtenu à partir de l' application d' opérations précédentes (par exemple de ne pas ouvrir immédiatement un fichier , ou la création d' une nouvelle trame de données).

Tout d'abord, dé-factorisez une chaîne à l'aide de la as.characterfonction, puis re-factorisez avec la as.factor(ou simplement factor) fonction:

fixed <- data.frame("Type" = character(3), "Amount" = numeric(3))

# Un-factorize (as.numeric can be use for numeric values)
#              (as.vector  can be use for objects - not tested)
fixed$Type <- as.character(fixed$Type)
fixed[1, ] <- c("lunch", 100)

# Re-factorize with the as.factor function or simple factor(fixed$Type)
fixed$Type <- as.factor(fixed$Type)

6

Le moyen le plus simple de résoudre ce problème consiste à ajouter un nouveau facteur à votre colonne. Utilisez la fonction de niveaux pour déterminer le nombre de facteurs dont vous disposez, puis ajoutez un nouveau facteur.

    > levels(data$Fireplace.Qu)
    [1] "Ex" "Fa" "Gd" "Po" "TA"
    > levels(data$Fireplace.Qu) = c("Ex", "Fa", "Gd", "Po", "TA", "None")
    [1] "Ex"   "Fa"   "Gd"   "Po"   " TA"  "None"

0

J'ai un problème similaire concernant les données extraites du fichier .xlsx. Malheureusement, je n'ai pas pu trouver la bonne réponse ici. Je l'ai géré moi-même avec dplyr comme ci-dessous, ce qui pourrait aider les autres:

#install.packages("xlsx")
library(xlsx)
extracted_df <- read.xlsx("test.xlsx", sheetName='Sheet1', stringsAsFactors=FALSE)
# Replace all NAs in a data frame with "G" character
extracted_df[is.na(extracted_df)] <- "G"

Cependant, je ne pouvais pas le gérer avec le readxlpackage qui n'a pas de paramètre similaire au stringsAsFactors. Pour la raison, je suis passé au xlsxpackage.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.