-->

警告消息:在`...`:无效因子水平,NA产生警告消息:在`...`:无效因子水平,NA产生(War

2019-05-08 15:47发布

我不明白为什么我得到这个警告信息。

> 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

Answer 1:

警告消息是因为你的“类型”的变量作出的一个因素,“午餐”不是一个定义的水平。 使用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"


Answer 2:

如果您是直接从CSV文件中读取数据,然后做这样的。

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


Answer 3:

这是一个灵活的方法 ,它可以在所有情况下使用,尤其是:

  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)


Answer 4:

解决这个问题的最简单方法是一个新的因素添加到您的列。 使用水平函数来确定你有多少因素,然后添加一个新的因素。

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


文章来源: Warning message: In `…` : invalid factor level, NA generated
标签: r warnings r-faq