无效因子水平,NA产生

我不明白为什么我得到这个错误消息。

> 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 

错误信息是因为你的“types”variables是一个因素,“午餐”不是一个定义的水平。 使数据框强制“types”为字符时使用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" 

如果你直接从CSV文件中读取,那么就这样做。

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

使用as.character函数“分解”一个string,并用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) 

这是一种灵活的方法 ,可以在所有情况下使用,特别是:

  1. 你只是想影响一列 ,或者
  2. data.frame是由于应用以前的操作 (例如,不立即打开文件或创builddataframe)而产生的。

解决这个问题的最简单方法是在列中添加一个新的因子。 使用关卡function来确定你有多less因素,然后添加一个新的因素。

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