ข้อความเตือน: ใน“ … `: ระดับปัจจัยไม่ถูกต้องสร้าง NA


136

ฉันไม่เข้าใจว่าทำไมฉันถึงได้รับข้อความเตือนนี้

> 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

คำตอบ:


217

ข้อความเตือนเป็นเพราะตัวแปร "ประเภท" ของคุณเป็นปัจจัยและ "อาหารกลางวัน" ไม่ใช่ระดับที่กำหนด ใช้stringsAsFactors = FALSEแฟล็กเมื่อสร้าง data frame เพื่อบังคับให้ "Type" เป็นอักขระ

> 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 ทำไม R ถึงแปลงเป็น Factor?
KannarKK

1
เนื่องจากนั่นเป็นการตั้งค่าเริ่มต้นในdata.frame()ฟังก์ชัน (และเป็นค่าเริ่มต้นเนื่องจากเป็นสิ่งที่ผู้ใช้ส่วนใหญ่ต้องการเป็นส่วนใหญ่)
David

46

หากคุณกำลังอ่านโดยตรงจากไฟล์ CSV ให้ทำเช่นนี้

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

stringAsFactors มีข้อผิดพลาด: อาร์กิวเมนต์ที่ไม่ได้ใช้ (stringAsFactors = FALSE)
Coliban

1
stringsAsFactors- stringsต้องเป็นพหูพจน์ (@Coliban)
campeterson

25

นี่คือแนวทางที่ยืดหยุ่นซึ่งสามารถใช้ได้ในทุกกรณีโดยเฉพาะ:

  1. ที่จะส่งผลกระทบต่อเพียงหนึ่งคอลัมน์หรือ
  2. dataframeได้รับจากการใช้การดำเนินงานก่อนหน้านี้ (เช่นไม่ได้ทันทีเปิดไฟล์หรือการสร้างกรอบข้อมูลใหม่)

ขั้นแรกให้ยกเลิกการแยกตัวประกอบสตริงโดยใช้as.characterฟังก์ชันจากนั้นแยกตัวประกอบใหม่ด้วยฟังก์ชันas.factor(หรือง่าย ๆ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

วิธีที่ง่ายที่สุดในการแก้ไขปัญหานี้คือการเพิ่มปัจจัยใหม่ในคอลัมน์ของคุณ ใช้ฟังก์ชันระดับเพื่อกำหนดจำนวนปัจจัยที่คุณมีแล้วเพิ่มปัจจัยใหม่

    > 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

ฉันมีปัญหาคล้ายกันซึ่งดึงข้อมูลมาจากไฟล์. xlsx น่าเสียดายที่ฉันไม่พบคำตอบที่เหมาะสมที่นี่ ฉันจัดการด้วยตัวเองด้วย dplyr ด้านล่างซึ่งอาจช่วยผู้อื่นได้:

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

อย่างไรก็ตามฉันไม่สามารถจัดการกับreadxlแพ็คเกจที่ไม่มีพารามิเตอร์คล้ายกับไฟล์stringsAsFactors. ด้วยเหตุผลฉันได้ย้ายไปที่xlsxแพ็คเกจ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.