web-dev-qa-db-ja.com

文字列を数値に変換する

テストファイルをインポートし、ヒストグラムを作成しようとしました

pichman <- read.csv(file="picman.txt", header=TRUE, sep="/t")   
hist <- as.numeric(pichman$WS)    

ただし、データセットの値から異なる数値を取得します。もともと私はテキストがあるからだと思ったので、テキストを削除しました:

table(pichman$WS)    
ws <- pichman$WS[pichman$WS!="Down" & pichman$WS!="NoData"]    

しかし、私はまだ非常に高い数字を取得していますが、誰かが考えていますか?

92
eliavs

要因に問題があると思われます。例えば、

> x = factor(4:8)
> x
[1] 4 5 6 7 8
Levels: 4 5 6 7 8
> as.numeric(x)
[1] 1 2 3 4 5
> as.numeric(as.character(x))
[1] 4 5 6 7 8

コメント:

  • ベクターには「Down」と「NoData」の文字が含まれていると言います。これらの値で何がas.numericに期待/期待されますか?
  • read.csvで、引数stringsAsFactors=FALSEを使用してみてください
  • sep="/tではなくsep="\t"であると確信していますか
  • コマンドhead(pitchman)を使用して、データの最初の数行を確認します
  • また、データを提供しないときに問題が何であるかを推測することは非常に難しいです。最小限の作業例が常に望ましい。たとえば、データセットにアクセスできないため、コマンドpichman <- read.csv(file="picman.txt", header=TRUE, sep="/t")を実行できません。
122
csgillespie

Csgillespieが言ったように。 stringsAsFactorsはTRUEのデフォルトで、テキストをファクターに変換します。そのため、テキストを削除した後でも、データフレームに要因が残っています。

変換に関しては、より最適な方法があります。参照としてここに置きます:

> x <- factor(sample(4:8,10,replace=T))
> x
 [1] 6 4 8 6 7 6 8 5 8 4
Levels: 4 5 6 7 8
> as.numeric(levels(x))[x]
 [1] 6 4 8 6 7 6 8 5 8 4

動作することを示すため。

タイミング:

> x <- factor(sample(4:8,500000,replace=T))
> system.time(as.numeric(as.character(x)))
   user  system elapsed 
   0.11    0.00    0.11 
> system.time(as.numeric(levels(x))[x])
   user  system elapsed 
      0       0       0 

これは大きな改善ですが、必ずしもボトルネックではありません。ただし、大きなデータフレームと変換する列が多い場合は重要になります。

10
Joris Meys