2013-07-11 14 views
6

私はRで作業しており、数値ベクトルを持つデータフレームdd_2006を持っています。最初にデータをインポートしたとき、$、小数点、およびいくつかの空白を、3つの変数、SumOfCost、SumOfCases、およびSumOfUnitsから削除する必要がありました。そのために、str_replace_allを使用しました。しかし、一度str_replace_allを使用すると、ベクトルは文字に変換されました。だからas.numeric(var)を使ってベクトルを数値に変換しましたが、as.numericコードを実行する前に以下のコードを実行しても、ベクトルにはNAsはありませんでした。NA強制なしで文字を数値に変換するR

sum(is.na(dd_2006$SumOfCost)) 
[1] 0 
sum(is.na(dd_2006$SumOfCases)) 
[1] 0 
sum(is.na(dd_2006$SumOfUnits)) 
[1] 0 

ここでは、インポート後のコードをベクトルから$を削除しています。 str(dd_2006)の出力では、スペースのためにいくつかの変数が削除されていますので、str_replace_allのコードの列番号は、ここに投稿した出力と一致しません(ただし、元のコードと同じです)。

library("stringr") 
dd_2006$SumOfCost <- str_sub(dd_2006$SumOfCost, 2,) #2=the first # after the $ 

#Removes decimal pt, zero's after, and commas 
dd_2006[ ,9] <- str_replace_all(dd_2006[ ,9], ".00", "") 
dd_2006[,9] <- str_replace_all(dd_2006[,9], ",", "") 

dd_2006[ ,10] <- str_replace_all(dd_2006[ ,10], ".00", "") 
dd_2006[ ,10] <- str_replace_all(dd_2006[,10], ",", "") 

dd_2006[ ,11] <- str_replace_all(dd_2006[ ,11], ".00", "") 
dd_2006[,11] <- str_replace_all(dd_2006[,11], ",", "") 

str(dd_2006) 
'data.frame': 12604 obs. of 14 variables: 
$ CMHSP      : Factor w/ 46 levels "Allegan","AuSable Valley",..: 1 1 1 
$ FY      : Factor w/ 1 level "2006": 1 1 1 1 1 1 1 1 1 1 ... 
$ Population    : Factor w/ 1 level "DD": 1 1 1 1 1 1 1 1 1 1 ... 
$ SumOfCases    : chr "0" "1" "0" "0" ... 
$ SumOfUnits    : chr "0" "365" "0" "0" ... 
$ SumOfCost     : chr "0" "96416" "0" "0" ... 

は、私は次のコードを使用して、同様の質問への応答がhereを採掘することが分かっ:

# create dummy data.frame 
d <- data.frame(char = letters[1:5], 
       fake_char = as.character(1:5), 
       fac = factor(1:5), 
       char_fac = factor(letters[1:5]), 
       num = 1:5, stringsAsFactors = FALSE) 

は、私たちはdata.frame

> d 
    char fake_char fac char_fac num 
1 a   1 1  a 1 
2 b   2 2  b 2 
3 c   3 3  c 3 
4 d   4 4  d 4 
5 e   5 5  e 5 
で一目を持ってみましょう

と実行しましょう:

> sapply(d, mode) 
     char fake_char   fac char_fac   num 
"character" "character" "numeric" "numeric" "numeric" 
> sapply(d, class) 
     char fake_char   fac char_fac   num 
"character" "character" "factor" "factor" "integer" 

これで、「どこが異常ですか?」まあ、私はRの非常に特異なものにぶつかってきましたが、これは最も混乱することではありませんが、あなたを混乱させる可能性があります。

ここに行く:最初の2つの列は文字です。私は意図的に2番目のfake_charを呼び出しました。この文字変数の類似点を、Dirkが返信で作成したものと比較します。これは実際には文字に変換された数値ベクトルです。第3列と第4列は因子であり、最後の列は「純粋な」数値です。

変換関数を使用する場合は、fake_charを数値に変換できますが、char変数自体は変換できません。

> transform(d, char = as.numeric(char)) 
    char fake_char fac char_fac num 
1 NA   1 1  a 1 
2 NA   2 2  b 2 
3 NA   3 3  c 3 
4 NA   4 4  d 4 
5 NA   5 5  e 5 
Warning message: 
In eval(expr, envir, enclos) : NAs introduced by coercion 
but if you do same thing on fake_char and char_fac, you'll be lucky, and get away with no NA's: 

(D、fake_char = as.numeric(fake_char)、 char_fac = as.numeric(char_fac))変換

char fake_char fac char_fac num 
1 a   1 1  1 1 
2 b   2 2  2 2 
3 c   3 3  3 3 
4 d   4 4  4 4 
5 e   5 5  5 5 

だから私は私のスクリプトで上記のコードを試してみましたしかし、まだNAs(強制に関する警告メッセージなし)が出てきました。

#changing sumofcases, cost, and units to numeric 
dd_2006_1 <- transform(dd_2006, SumOfCases = as.numeric(SumOfCases), SumOfUnits = as.numeric(SumOfUnits), SumOfCost = as.numeric(SumOfCost)) 

> sum(is.na(dd_2006_1$SumOfCost)) 
[1] 12 
> sum(is.na(dd_2006_1$SumOfCases)) 
[1] 7 
> sum(is.na(dd_2006_1$SumOfUnits)) 
[1] 11 

私も観測で逃した任意の文字があるかどうかを確認するために観測を見てtable(dd_2006$SumOfCases)などを使用しましたが、任意のはありませんでした。なぜNAsがポップアップしているのか、どうやってそれらを取り除くのかについての考えはありますか?

+2

申し訳ありませんが、何が問題ですか?リンクされた答えは、すべてを非常にうまくまとめているようですが、問題の再現可能な例がなくても、あなたは実際に直面しています。私は他の人がどのように助けてくれるのかよくわかりません... – A5C1D2H2I1M1N2O1R2T1

+0

このデータはExcelまたは別のスプレッドシート。次回は、エクスポートする前にすべての書式を消去してください。 –

答えて

10

アナンダが指摘したように、問題はデータのどこかにあり、再現可能な例がなければ、私たちは本当に助けてくれません。それによると、ここにあなたがあなたの問題を引き起こしているデータ内のレコードを突き止めるのに役立つコードスニペットです:

test = as.character(c(1,2,3,4,'M')) 
v = as.numeric(test) # NAs intorduced by coercion 
ix.na = is.na(v) 
which(ix.na) # row index of our problem = 5 
test[ix.na] # shows the problematic record, "M" 

代わりにNASが導入されている理由を推測する、問題を引き起こしているレコードを引き出しますNAがなくなるまで直接/個別に対処してください。

更新:str_replace_allへの電話に問題があるように見えます。私はstringrライブラリを知らないが、私はあなたがこのようなgsubと同じことを成し遂げることができると思う:私はこれはしかし実現するもの全くわからないんだけど

v2 = c("1.00","2.00","3.00") 
gsub("\\.00", "", v2) 

[1] "1" "2" "3" 

sum(as.numeric(v2)!=as.numeric(gsub("\\.00", "", v2))) # Illustrate that vectors are equivalent. 

[1] 0 

この場合を除きあなたのためのいくつかの特定の目的を達成する、私はあなたの前処理からこのステップを削除することをお勧めします、それは必要ないと思われるので、あなたに問題を与えているようです。

+0

SumOfUnitsのコードを実行すると、 '>(ix.na)#row問題のインデックスNAs [1] 1098 2297 4728 5559 5592 5702 6955 8191 10517 10881 10955 > test [ix.na]#[ 元のデータセットの行を見ると、次のようになります。 'SumOfUnits 800.00 0.00 100.00 100.00 100.00 300.00 400.00 200.00 200.00 600.00 100.00' それでは、どのプロということです'str_replace_all'コードを実行したときに何か起きてしまったのですか? – idemanalyst

+0

問題をピンナップしたようです。小数点の有無に関わらず、これらの値を数値にキャストすることができるので、それらの文字列がどのように処理されているのかは分かりませんが、私は更新された答えに 'gsub'を使用しています。 –

+0

それは、ありがとう! – idemanalyst

4

文字を数値に変換したい場合は、まずas.factorを使用して係数に変換し、既存の変数を保存/上書きします。次に、この因子変数を数値に変換します(as.numericを使用)。このようにしてNAsを作成することはなく、データセットを数値に変換することができます。

+0

as.numeric(as.factor(df $ x))は値を1と2で置き換えるだけで、インデックス –

関連する問題