警告メッセージ:「…」内:無効な因子レベル、生成されたNA


135

この警告メッセージが表示された理由がわかりません。

> 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

回答:


216

警告メッセージは、「タイプ」変数が因子にされ、「ランチ」が定義されたレベルではなかったためです。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"

1
@DavidなぜRはそれをFactorに変換するのですか?
KannarKK 2015

1
data.frame()これは、関数のデフォルト設定であるためです(そして、ほとんどのユーザーが大部分の時間に必要とするものであるため、デフォルトです)。
デビッド

46

CSVファイルから直接読み取る場合は、次のようにします。

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

stringAsFactorsがエラーをスローしています:未使用の引数(stringAsFactors = FALSE)
コリバン

1
stringsAsFactors- strings複数である必要があります(@Coliban)
campeterson

24

これは柔軟なアプローチであり、特にすべての場合に使用できます。

  1. 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)

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"

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パッケージに移動しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.