Pesan peringatan: Dalam `...`: tingkat faktor tidak valid, NA dihasilkan

135

Saya tidak mengerti mengapa saya mendapat pesan peringatan ini.

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

Jawaban:

216

Pesan peringatan itu karena variabel "Tipe" Anda dijadikan faktor dan "makan siang" bukan tingkat yang ditentukan. Gunakan stringsAsFactors = FALSEbendera saat membuat bingkai data Anda untuk memaksa "Ketik" menjadi karakter.

> 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
sumber
1
@ David Mengapa R mengubahnya menjadi Faktor?
KannarKK
1
Karena itu adalah pengaturan default dalam data.frame()fungsi (dan itu adalah default karena itulah yang paling diinginkan sebagian besar pengguna).
David
46

Jika Anda membaca langsung dari file CSV maka lakukan seperti ini.

myDataFrame <- read.csv("path/to/file.csv", header = TRUE, stringsAsFactors = FALSE)
Chirag
sumber
stringAsFactors melempar kesalahan: argumen yang tidak digunakan (stringAsFactors = FALSE)
Coliban
1
stringsAsFactors- stringsHarus jamak (@Coliban)
campeterson
24

Berikut ini adalah pendekatan yang fleksibel , dapat digunakan dalam semua kasus, khususnya:

  1. untuk mempengaruhi hanya satu kolom , atau
  2. yang dataframetelah diperoleh dari menerapkan operasi sebelumnya (misalnya tidak segera membuka file , atau membuat frame data baru).

Pertama, un-faktorkan string menggunakan as.characterfungsi, dan, kemudian, ulang faktor dengan fungsi as.factor(atau hanya 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
sumber
6

Cara termudah untuk memperbaikinya adalah menambahkan faktor baru ke kolom Anda. Gunakan fungsi level untuk menentukan berapa banyak faktor yang Anda miliki dan kemudian tambahkan faktor baru.

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

Saya punya masalah serupa yang data diambil dari file .xlsx. Sayangnya, saya tidak dapat menemukan jawaban yang tepat di sini. Saya menanganinya sendiri dengan dplyr seperti di bawah ini yang dapat membantu orang lain:

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

Namun, saya tidak bisa mengatasinya dengan readxlpaket yang tidak memiliki parameter mirip dengan stringsAsFactors. Karena itu, saya telah pindah ke xlsxpaket.

ozturkib
sumber