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

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"

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)

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)

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"

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.