2

data.frame に問題があります。それを非常に簡単にするために、私はから始めます

    test<-data.frame(char=character(10), numr=numeric(10))
    test$char[1]<-"ery"

結果は

    Warning message:In `[<-.factor`(`*tmp*`, 1, value = c(NA, 1L, 1L, 1L, 1L, 1L, 1L,  :
   invalid factor level, NAs generated

もしそうなら、私はmode(test$char)得る[1] "numeric"

もしそうなら、私はmode(test$numr)得る[1] "character"

エラーなしで行うこともできtest$numr[1]<-"fjfj"、データはその特定の場所に保存されます。

data.frame を設定する代わりに、character(10)すべてを数値として行う場合、前の例のように、以前は数値として定義されていたとしても、列に文字列を格納するだけで、数値を文字に変更できます。 . 私の例のように、R が予想とは異なる方法で文字を扱うのはなぜですか?

4

1 に答える 1

2

上に投稿されたあなたの結果には少し疑問があります。

>     test<-data.frame(char=character(10), numr=numeric(10))
> str(test)
'data.frame':   10 obs. of  2 variables:
 $ char: Factor w/ 1 level "": 1 1 1 1 1 1 1 1 1 1
 $ numr: num  0 0 0 0 0 0 0 0 0 0
> mode(test$char)
[1] "numeric"
> mode(test$numr)
[1] "numeric"

これはchar、因子でnumrあり、数値であり、両方が数値として格納されていることを示しています (因子には、数値レベル コードをラベルにマップする追加の属性があります)。charレベルのリスト (空の string のみを含む) に含まれていない値を に設定しようとしているため、エラーが発生します""。@GSeeがコメントで言っているように、おそらくあなたは望んでいたstringsAsFactors=FALSE

> test<-data.frame(char=character(10), numr=numeric(10), 
                   stringsAsFactors=FALSE)
> str(test)
'data.frame':   10 obs. of  2 variables:
 $ char: chr  "" "" "" "" ...
 $ numr: num  0 0 0 0 0 0 0 0 0 0
> test$char[1] <- "ery" ## no error

options(stringsAsFactors=FALSE)これをグローバルなデフォルトの動作にするように設定できます。ここでは、自分にとっての利便性と、次にこのオプションをグローバルに設定していることを忘れて、StackOverflow で質問したときに、なぜ異なる回答が得られるのか不思議に思ったときに混乱するというトレードオフがあります。

最後に、上で述べたように、char数値として開始すると、要素を文字値に設定しようとすると、R は黙ってそれを文字列に強制します。これは実際にはかなり悪い設計だと思いますが、Rの動作に深く組み込まれているため、現在変更することはできません...

> test<-data.frame(char=numeric(10), numr=numeric(10))
> test$char[1] <- "ery"
> str(test)
'data.frame':   10 obs. of  2 variables:
 $ char: chr  "ery" "0" "0" "0" ...
 $ numr: num  0 0 0 0 0 0 0 0 0 0
于 2012-12-05T20:04:21.337 に答える