web-dev-qa-db-ja.com

警告メッセージ: `...`で:無効な因子レベル、NAが生成されました

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

> 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
124
ihm

警告メッセージは、あなたの "Type"変数が要素にされ、 "lunch"が定義されたレベルではなかったためです。データフレームを作成して "Type"を強制的に文字にする場合は、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"
187
David

あなたがCSVファイルから直接読んでいるならば、このようにしてください。

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

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

  1. toが1つの列にのみ影響する、または
  2. dataframeは、前の操作を適用して得られたものです(例:すぐにファイルを開かない、または新しいデータフレームを作成する)。

まず、n-factorizeas.character関数を使用した文字列、次にre-factorizeas.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)
20
toto_tico

これを修正する最も簡単な方法はあなたのコラムに新しい要素を追加することです。水準関数を使用して、いくつの要因があるかを判断してから、新しい要因を追加します。

    > 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"
6
Eddie Miller