Thông báo cảnh báo: Trong `'` `: mức yếu tố không hợp lệ, NA được tạo


134

Tôi không hiểu tại sao tôi nhận được tin nhắn cảnh báo này.

> 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

Câu trả lời:


216

Thông báo cảnh báo là do biến "Loại" của bạn được tạo thành một yếu tố và "bữa trưa" không phải là một mức xác định. Sử dụng stringsAsFactors = FALSEcờ khi tạo khung dữ liệu của bạn để buộc "Loại" thành ký tự.

> 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 Tại sao R chuyển đổi nó thành Factor?
KannarKK

1
Bởi vì đó là cài đặt mặc định trong data.frame()chức năng (và nó là mặc định vì đó là điều mà hầu hết người dùng muốn phần lớn thời gian).
David

46

Nếu bạn đang đọc trực tiếp từ tệp CSV thì hãy làm như thế này.

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

stringAsFactors đang đưa ra một lỗi: đối số không được sử dụng (stringAsFactors = FALSE)
Coliban

1
stringsAsFactors- stringscần phải là số nhiều (@Coliban)
campeterson

24

Đây là một cách tiếp cận linh hoạt , nó có thể được sử dụng trong mọi trường hợp, đặc biệt:

  1. để chỉ ảnh hưởng đến một cột , hoặc
  2. các dataframeđã được thu được từ việc áp dụng các hoạt động trước đó (ví dụ như không ngay lập tức mở một tập tin , hoặc tạo ra một khung dữ liệu mới).

Đầu tiên, bỏ yếu tố chuỗi bằng cách sử dụng as.characterhàm và sau đó, tái hệ số hóa với hàm as.factor(hoặc đơn giản 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

Cách dễ nhất để khắc phục điều này là thêm một yếu tố mới vào cột của bạn. Sử dụng hàm cấp độ để xác định có bao nhiêu yếu tố bạn có và sau đó thêm một yếu tố mới.

    > 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

Tôi đã gặp vấn đề tương tự mà dữ liệu được lấy từ tệp .xlsx. Thật không may, tôi không thể tìm thấy câu trả lời thích hợp ở đây. Tôi tự xử lý nó với dplyr như dưới đây có thể giúp người khác:

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

Tuy nhiên, tôi không thể xử lý nó với readxlgói không có tham số tương tự stringsAsFactors. Vì lý do, tôi đã chuyển sang xlsxgói.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.