8

R をしばらく使用していますが、因子とデータ フレームにまだ苦労しています。これが私の質問です。

次のように、異なるタイプの複数の列で構成されるデータ フレームを事前に割り当てようとしています。

cb <- data.frame(S=character(1000), I=numeric(1000), A=as.Date(rep(0,1000), origin = "1900-01-01"), SD=as.POSIXct(rep(0,1000), origin = "1900-01-01 00:00:00"), CC=numeric(1000), stringsAsFactors=FALSE)

これは、必要なデータ フレーム タイプを満たします (str(cb) の出力):

'data.frame':   1000 obs. of  5 variables:
 $ S : chr  "" "" "" "" ...
 $ I : num  0 0 0 0 0 0 0 0 0 0 ...
 $ A : Date, format: "1900-01-01" "1900-01-01" "1900-01-01" "1900-01-01" ...
 $ SD: POSIXct, format: "1900-01-01" "1900-01-01" "1900-01-01" "1900-01-01" ...
 $ CC: num  0 0 0 0 0 0 0 0 0 0 ...

データ フレームの最初のアイテムを割り当てると、CC と I が文字になります。

cb[1, ] <- c("ABCD", 4, "2005-12-12", "2008-04-03 20:30", 3)

str(cb) の出力:

'data.frame':   1000 obs. of  5 variables:
 $ S : chr  "ABCD" "" "" "" ...
 $ I : chr  "4" "0" "0" "0" ...
 $ A : Date, format: "2005-12-12" "1900-01-01" "1900-01-01" "1900-01-01" ...
 $ SD: POSIXct, format: "2008-04-03 20:30:00" "1900-01-01 00:00:00" "1900-01-01 00:00:00" "1900-01-01 00:00:00" ...
 $ CC: chr  "3" "0" "0" "0" ...

これにより、私の目的にはかなり使用できなくなります。

data.frame 定義で stringsAsFactors=FALSE を省略すると、(明らかに) 別のエラー メッセージが表示されます (warn を 2 に設定):

Error in `[<-.factor`(`*tmp*`, iseq, value = "ABCD") : 
  (converted from warning) invalid factor level, NAs generated

私は理解していますが、克服する方法もわかりません。

私は何を間違っていますか?I 列と SD 列の数値型を確実に保持するにはどうすればよいですか? どうもありがとうございました。

乾杯

B

4

1 に答える 1

10

ベクトルに型を混在させることはできないため、ベクトルは文字に強制されています。

R> c("ABCD", 4, "2005-12-12", "2008-04-03 20:30", 3)
[1] "ABCD"             "4"               
[3] "2005-12-12"       "2008-04-03 20:30"
[5] "3"

[<-.data.frame次に、data.frame の数値列を文字に強制するため、列は 1 つの型になります。Date/POSIXtフィールドも文字に変換しないというのは少し矛盾していますが...

リスト内でタイプを混在させることができます。この置換は、data.frames がその下のリストであるため機能します。

cb[1, ] <- list("ABCD", 4, "2005-12-12", "2008-04-03 20:30", 3)

後でコードを見直したときに、data.frame の 1 行を 1 行の data.frame に置き換える方が理にかなっている場合があります。

cb[1, ] <- data.frame("ABCD", 4, "2005-12-12", "2008-04-03 20:30", 3,
                      stringsAsFactors=FALSE)
于 2013-04-15T22:03:59.820 に答える