Mensagem de aviso: Em `...`: nível de fator inválido, NA gerado

135

Não entendo por que recebi essa mensagem de aviso.

> 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
fonte

Respostas:

216

A mensagem de aviso é porque sua variável "Tipo" foi considerada um fator e "almoço" não foi um nível definido. Use a stringsAsFactors = FALSEbandeira ao criar seu quadro de dados para forçar "Tipo" a ser um caractere.

> 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
fonte
1
@ David Por que R convertê-lo em fator?
KannarKK
1
Porque essa é a configuração padrão na data.frame()função (e é padrão porque é isso que a maioria dos usuários deseja na grande maioria das vezes).
David
46

Se você estiver lendo diretamente do arquivo CSV, faça o seguinte.

myDataFrame <- read.csv("path/to/file.csv", header = TRUE, stringsAsFactors = FALSE)
Chirag
fonte
stringAsFactors está lançando um erro: argumento não utilizado (stringAsFactors = FALSE)
Coliban
1
stringsAsFactors- stringsprecisa ser plural (@Coliban)
campeterson
24

Aqui está uma abordagem flexível , que pode ser usada em todos os casos, em particular:

  1. para afectar apenas uma coluna , ou
  2. o dataframefoi obtido a partir de operações de aplicação anteriores (por exemplo, não abrir imediatamente um arquivo , ou a criação de uma nova trama de dados).

Primeiro, descompacte uma string usando a as.characterfunção e, em seguida, re-fatorize com a função as.factor(ou simplesmente 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)
toto_tico
fonte
6

A maneira mais fácil de corrigir isso é adicionar um novo fator à sua coluna. Use a função de níveis para determinar quantos fatores você possui e adicione um novo fator.

    > 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
fonte
0

Eu tenho um problema semelhante que os dados recuperados do arquivo .xlsx. Infelizmente, não consegui encontrar a resposta correta aqui. Eu lidei sozinho com dplyr, como abaixo, o que pode ajudar outras pessoas:

#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"

No entanto, eu não poderia lidar com isso com o readxlpacote que não possui parâmetro semelhante ao stringsAsFactors. Por esse motivo, mudei para o xlsxpacote.

ozturkib
fonte