web-dev-qa-db-fra.com

Message d'avertissement: Dans `...`: niveau de facteur non valide, NA généré

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
125
ihm

Le message d'avertissement vient du fait que votre variable "Type" a été transformée en facteur et que "déjeuner" n'était pas un niveau défini. Utilisez l'indicateur stringsAsFactors = FALSE lors de la création du cadre 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"
189
David

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

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

Voici un approche flexible, il peut être utilisé dans tous les cas, en particulier:

  1. to affecte une seule colonne, ou
  2. la dataframe a été obtenue en appliquant les opérations précédentes (par exemple, ne pas ouvrir immédiatement un fichier, ou en créant un nouveau bloc de données).

D'abord, décomposez une chaîne de caractères à l'aide de la fonction as.character, puis, remodifiez avec la fonction as.factor (ou simplement factor):

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)
21
toto_tico

Le moyen le plus simple de résoudre ce problème consiste à ajouter un nouveau facteur à votre colonne. Utilisez la fonction level 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"
6
Eddie Miller