2013-05-29 57 views
95

我不明白爲什麼我得到這個警告信息。警告信息:在`...`:無效因子水平,產生的不適用

> 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 

回答

150

該警告消息是因爲您的「類型」變量是因素,「午餐」不是定義的級別。使數據框強制「類型」爲字符時使用stringsAsFactors = FALSE標誌。

> 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將它轉換成因子? – KannarKK

+1

因爲這是'data.frame()'函數中的默認設置(並且它是默認設置,因爲這是大多數用戶絕大多數時間需要的)。 – David

34

如果您直接從CSV文件中讀取數據,請按照以下步驟操作。

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

這是一個靈活的方法,它可以在所有情況下使用,尤其是:

  1. 你只是想影響一列,或
  2. data.frame導致從應用以前的操作(例如不立即打開文件或創建數據框)。

首先,未比化使用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) 
3

的解決這個問題的最簡單方法是在列中添加一個新因素。使用水平函數來確定您有多少個因子,然後添加一個新因子。

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