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
ihm
la source

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"
David
la source
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)
Chirag
la source
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)
toto_tico
la source
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"
Eddie Miller
la source
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.

ozturkib
la source