警告信息:在`...`:无效因子级别,NA生成

时间:2013-05-29 17:05:18

标签: r warnings r-faq

我不明白为什么会收到此警告信息。

> 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

5 个答案:

答案 0 :(得分:186)

警告信息是因为您的&#34;类型&#34;变量是一个因素和午餐&#34;不是一个确定的水平。在使数据框强制使用时,请使用stringsAsFactors = FALSE标记&#34;键入&#34;成为一个角色。

> 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 :(得分:39)

如果您直接从CSV文件阅读,请执行此操作。

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

答案 2 :(得分:19)

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

  1. 仅影响一列
  2. bootsd = function(data, boots, seed = 1234){ if (!missing(seed)) set.seed(seed) ci.pct <- foreach(j = 1:nrow(data)) %do% { datast1 <- c(rep(1, data[j, "num"]), rep(0, data[j, "denom"])) pct <- foreach(i = 1:boots, .combine = 'c') %dopar% { index <- sample(1:length(datast1), size = length(datast1), replace = T) sampledata <- datast1[index] mean(sampledata) } cbind(quantile(pct, prob=c(0.025))*100000, quantile(pct, prob=c(0.975))*100000) } ci.pcts <- do.call("rbind", ci.pct) return(ci.pcts) } bootsd(data = maindata, boots = 5, seed = 1234) 已通过应用之前的操作获得(例如未立即打开文件,或创建新数据框)。
  3. 首先,使用dataframe函数取消分解字符串,然后使用as.character 重新分解(或简单地) as.factor)功能:

    factor

答案 3 :(得分:6)

解决此问题的最简单方法是为列添加新因子。使用级别功能确定您拥有的因子数量,然后添加新因子。

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

答案 4 :(得分:0)

我也遇到了类似的问题,该问题是从.xlsx文件检索的数据。不幸的是,我在这里找不到正确的答案。我使用dplyr自行处理了以下问题,这可能会对其他人有所帮助:

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

但是,我无法使用readxl package来处理它,该参数没有与stringsAsFactors相似的参数。因此,我已移至xlsx程序包。