2013-07-11 23 views
6

我正在R中工作,並且有數據框dd_2006和數字向量。當我第一次導入數據時,我需要從我的三個變量中刪除$的小數點和一些空格:SumOfCost,SumOfCases和SumOfUnits。要做到這一點,我使用了str_replace_all。但是,一旦我使用str_replace_all,矢量被轉換爲字符。因此,我使用as.numeric(var)將矢量轉換爲數字,但引入了NAs,即使在運行as.numeric代碼之前運行下面的代碼時,向量中也沒有NAs。在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代碼中的列#s與我在此處發佈的輸出不匹配(但它們是在原始代碼中執行的):

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中碰到了很奇怪的東西,這並不是最混亂的東西,但它可能會讓你困惑,尤其是如果你在躺在牀上之前閱讀它。

這裏是:前兩列是字符。我故意叫第二個fake_char。找出這個字符變量與Dirk在他的回覆中創建的變量的相似性。它實際上是一個轉換爲字符的數字向量。第三和第四列是因子,最後一列是「純粹」數字。

如果您使用轉換函數,您可以將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 

於是,我在我的腳本上述代碼,但仍然拿出新生(沒有關於強制的警告信息)。

#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)等等看的意見,看看是否有我的看法錯過任何字符,但沒有發現任何。關於爲什麼新生兒出現,以及如何擺脫他們的任何想法?

+2

對不起,但是什麼問題?鏈接的答案似乎總結一切都很好,沒有一個可重現的問題的例子*你真的正在面對,我不知道其他人可以如何幫助.... – A5C1D2H2I1M1N2O1R2T1

+0

我猜這些數據來自Excel或另一個電子表格。下一次,請在導出之前清除所有格式。 –

回答

10

正如Anando指出的那樣,問題出在您的數據中,如果沒有可重複的例子,我們無法真正幫助您。這就是說,這裏的代碼片段,幫助你拖住你的數據是造成你的問題記錄:

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消失。

更新:看起來問題在於您撥打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的代碼時,我得到了問題NAs [1]的哪個(ix.na)#row索引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替換值,索引 –

相關問題