警告信息:在`...`中:无效的因子水平,生成NA

145

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

> 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个回答

223

警告信息是因为您的“Type”变量被定义为因子且“lunch”不是已定义的水平。在创建数据框时,使用stringsAsFactors = FALSE标志来将“Type”强制转换为字符。

> 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 把它转换成因子(Factor)? - KannarKK
2
因为这是data.frame()函数的默认设置(并且之所以是默认设置,是因为大多数用户在绝大多数情况下都需要它)。 - David

49

如果您直接从CSV文件中读取,则应像这样操作。

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

stringAsFactors 抛出错误:未使用的参数(stringAsFactors=FALSE)。 - Coliban
1
stringsAsFactors - strings 需要是复数形式 (@Coliban) - campeterson

28

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

  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)

7
最简单的解决方法是向你的列中添加一个新因子。使用levels功能确定你有多少个因子,然后添加一个新因子。
    > 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"

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来处理它,因为该包没有与stringsAsFactors相似的参数。出于这个原因,我转向了xlsx包。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接