141

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

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

5 回答 5

223

警告消息是因为您的“类型”变量是一个因素,而“午餐”不是一个定义的级别。在制作数据框时使用该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"
于 2013-05-29T17:09:57.013 回答
48

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

myDataFrame <- read.csv("path/to/file.csv", header = TRUE, stringsAsFactors = FALSE)
于 2016-03-04T08:16:18.557 回答
27

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

  1. 影响一列,或
  2. dataframe通过应用以前的操作(例如,不立即打开文件或创建新数据框)获得。

首先,使用函数对字符串进行分解as.character,然后使用(或简单地)函数重新分解:as.factorfactor

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)
于 2016-08-02T16:38:07.010 回答
7

解决此问题的最简单方法是在列中添加一个新因子。使用级别函数来确定您有多少个因子,然后添加一个新因子。

    > 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"
于 2017-07-27T05:14:41.120 回答
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包裹里。

于 2020-06-11T14:34:39.487 回答