2

次のような文字ベクトルがあります。

"Internet" "Internet" "-1"       "-5"       "Internet" "Internet" 

負の数値(-1、-5など)になるすべての値を。に置き換えたい。NA

私はこのコードでそれをしました:

hintsData$WhereSeekHealthInfo[hintsData$WhereSeekHealthInfo < 0] <- NA

それはうまくいったようです:

head(hintsData$WhereSeekHealthInfo)
# [1] "Internet" "Internet" NA         NA         "Internet" "Internet"

しかし、私がやったとき

> sum(hintsData$WhereSeekHealthInfo == "Internet")
# [1] NA

基本的に、何らかの方法でベクトルを変更したため、値を合計できなくなりましたか?

NAコードを実行する前に、コードを実行してこれを取得することができました。

> sum(hintsData$WhereSeekHealthInfo == "Internet")
# [1] 1691

したがって、「-1」、「-5」などの値をNAに置き換えることができますが、それでも次のようになります。

> sum(hintsData$WhereSeekHealthInfo == "Internet")
# [1] 1691

アイデアがあれば教えてください。NAに置き換えることについて他の質問を見つけましたが、NAに置き換えると値をカウントできなくなる理由がわからないため、何を検索するか、除外するかがわかりません。

4

2 に答える 2

5

sumna.rm引数があり、それをに設定するとTRUE、が削除されますNA。(一般的に1+NA = NA、、したがって、値を削除する必要がありNAます)

そうは言っても、あなたのベクトルが文字であることを考えると、あなたはあなたの状態に少し卑劣です<0(この場合は機能しますが、それが堅牢であるとは思いません)

NAに値を設定するための慣用的なアプローチは、たとえばRを使用することです。is.na<-

is.na(hintsData$WhereSeekHealthInfo) <- hintsData$WhereSeekHealthInfo <0

データの読み込み方法に応じて、情報を処理するように設定できます

たとえば、テキストファイルを読み取る前に有効な応答を知っていれば、独自のクラスを作成できます。

 setAs("character","Q1", function(from) factor(from ,levels = c('Internet','Newspaper'))

 read.csv('mytextfile.csv', colClasses = list(WhereSeekHealthInfo = 'Q1')

またはおそらく(NA値についてはより明確であり、有効な値が何であるかについてはより明確ではありません。

  setAs("character","Q1b", function(from) {is.na(from) <- suppressWarnings(as.numeric(from)) <0;from})
于 2013-03-25T22:48:55.357 に答える
0

この理由は 、 (それ自体であっても)の任意の値に対してx == NA戻るためです。NAxxNA

したがって、Arunの提案を使用する必要があります。sum(..., na.rm=TRUE)

于 2013-03-25T22:48:19.247 に答える