2013-05-29 35 views

Trả lời

150

Cảnh báo là vì "Loại" biến của bạn đã được thực hiện một yếu tố và "ăn trưa" không phải là một mức quy định. Sử dụng cờ stringsAsFactors = FALSE khi đặt khung dữ liệu của bạn để buộc "Loại" là 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 yếu tố? – KannarKK

+1

Vì đó là thiết lập mặc định trong hàm 'data.frame()' (và nó là mặc định vì đó là những gì hầu hết người dùng muốn phần lớn thời gian). – David

34

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) 
9

này 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ụ thể:

  1. bạn chỉ muốn ảnh hưởng đến một cột, hoặc
  2. các data.frame đã dẫn đến từ việc áp dụng các hoạt động trước đó (ví dụ: không mở ngay lập tức một tệp hoặc tạo khung dữ liệu của bạn).

Thứ nhất, un-động lực một chuỗi bằng cách sử dụng as.character chức năng, và, sau đó, lại động lực với as.factor (hoặc đơn giản là factor) chức năng:

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) 
3

Các 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 mức để 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" 
Các vấn đề liên quan