2013-12-13 54 views
1

我試圖將一系列文本文件讀入R.這些文件具有相同的形式,至少看起來是相同的形式。除了一個文件,一切都很好。當我讀取該文件時,R將所有數字視爲字符。我用as.numeric轉換回來,但數據值改變了。我也嘗試將文本文件轉換爲csv,然後讀入R,但它也不起作用。請問有沒有人有這樣的問題?請問如何解決它?謝謝!R將一個數字作爲一個字符

該數據來自人類死亡率數據庫。由於版權問題,我無法在這裏附上數據。但是每個人都可以通過HMD註冊並下載數據(www.mortality.org)。作爲一個例子,我使用了澳大利亞和比利時的1乘1曝光數據。

我的代碼如下:

AUSe<-read.table("AUS.Exposures_1x1.txt",skip=1,header=TRUE)[,-5] 
BELe<-read.table("BEL.Exposures_1x1.txt",skip=1,header=TRUE)[,-5] 

然後我想在上述數據幀或基質添加一些行。對於澳大利亞的數據(例如AUSe[1,3]+AUSe[2,3])是很好的。但是,將相同的命令應用於比利時數據時發生錯誤:BELe[1, 3] + BELe[2, 3]中的錯誤:對二元運算符的非數字參數。但如果你看一下文本文件,你知道那是兩個數字。很顯然R在閱讀文本文件時將一個數字看作一個字符,這很奇怪。

+0

'read.csv(...,stringsAsFactors = FALSE)'(編輯:這jives與@ josilber的評論) –

+0

你正在轉換爲csv的文本文件中是什麼?它是如何工作的?請張貼您遇到的問題和您嘗試的內容的示例。 – josliber

+1

至於暗示你最有可能在列中有一些字符。這會導致R將它作爲最初的因素進行存儲。當在一個因子上使用as.numeric時,你不會得到原始數字 - 你會得到因子水平。給定的答案將允許您以字符的形式讀取它 - 此時您應該檢查數據以查看哪些值不是「實際數字」。 – Dason

回答

1

試試這個:

BELe<-read.table("BEL.Exposures_1x1.txt",skip=1, colClasses="numeric", header=TRUE)[,-5] 

或者你可以肯定張貼文件的只是一點點,並沒有違反至少任何版權法在我的管轄範圍(我認爲這是同一個像人死亡數據庫)。

Belgium, Exposure to risk (period 1x1)  Last modified: 04-Feb-2011, MPv5 (May07) 

    Year  Age  Female   Male   Total 
    1841  0  61006.15  62948.23 123954.38 
    1841  1  55072.53  56064.21 111136.73 
    1841  2  51480.76  52521.70 104002.46 
    1841  3  48750.57  49506.71  98257.28 
    ....   .  .... 

所以我可能會建議更加準確colClasses:

BELe<-read.table("BEL.Exposures_1x1.txt",skip=2, # really two lines to skip I think 
       colClasses=c(rep("integer", 2), rep("numeric",3)), 
       header=TRUE)[,-5] 

我懷疑promlem發生,因爲像這些行:

1842  110+   0.00   0.00   0.00 

所以,你需要確定如何您對維護110+值有很大的興趣。用我的方法,他們將被強制爲NA's。 (嗯,我還以爲他們會但像你,我得到了一個錯誤,以便需要此多步驟的過程:

BELe<-read.table("Exposures_1x1.txt",skip=2, 
        header=TRUE) 
BELe[ , 2:5] <- lapply(BELe[ , 2:5], as.character) 
str(BELe) 
#------------- 
'data.frame': 18759 obs. of 5 variables: 
$ Year : int 1841 1841 1841 1841 1841 1841 1841 1841 1841 1841 ... 
$ Age : chr "0" "1" "2" "3" ... 
$ Female: chr "61006.15" "55072.53" "51480.76" "48750.57" ... 
$ Male : chr "62948.23" "56064.21" "52521.70" "49506.71" ... 
$ Total : chr "123954.38" "111136.73" "104002.46" "98257.28" ... 
#------------- 
BELe[ , 2:5] <- lapply(BELe[ , 2:5], as.numeric) 

#---------- 
Warning messages: 
1: In lapply(BELe[, 2:5], as.numeric) : NAs introduced by coercion 
2: In lapply(BELe[, 2:5], as.numeric) : NAs introduced by coercion 
3: In lapply(BELe[, 2:5], as.numeric) : NAs introduced by coercion 
4: In lapply(BELe[, 2:5], as.numeric) : NAs introduced by coercion 
str(BELe) 
#----------- 
'data.frame': 18759 obs. of 5 variables: 
$ Year : int 1841 1841 1841 1841 1841 1841 1841 1841 1841 1841 ... 
$ Age : num 0 1 2 3 4 5 6 7 8 9 ... 
$ Female: num 61006 55073 51481 48751 47014 ... 
$ Male : num 62948 56064 52522 49507 47862 ... 
$ Total : num 123954 111137 104002 98257 94876 ... 
# and just to show that tey are not really integers: 
BELe$Total[1:5] 
#[1] 123954.38 111136.73 104002.46 98257.28 94875.89 
+0

謝謝你的迴應。但我仍然有問題。第二列中的一個條目是「110+」,這會導致錯誤。因此,我將colClasses更改爲整數,字符和3個數字。現在我得到了以下錯誤:掃描(文件,什麼,nmax,sep,dec,引用,跳過,nlines,na.strings,: 掃描()期望'真實',得到'。' – LaTeXFan

+0

此外,我真的看不出AUS和BEL數據有什麼區別,爲什麼R會用不同的方式對待它們? – LaTeXFan

+0

看起來不錯,但仍然不起作用 – LaTeXFan

0

你可以嘗試read.csv(... stringsAsFactors = FALSE)嗎?

+0

不,這不起作用。 – LaTeXFan

+0

我想有一個類似的問題。也許你的答案在那裏? http://stackoverflow.com/questions/13706188/importing-csv-file-into-r-numeric-values-read-as-characters –

1

我通常讀取這些文件的方式是:

BELexp <- read.table("BEL.Exposures_1x1.txt", skip = 2, header = TRUE, na.strings = ".", as.is = TRUE) 

注意,比利時在第一次世界大戰期間失去了3年的數據,這些數據可能永遠無法恢復,因此這三年都是國家統計局,在這些文件中標有"."這個字符串,因此參數na.strings = "."。指定該參數將處理所有列Age,這是字符(故意),由於"110+"。 HMD這樣做的原因是,用戶必須有意識地處理開放年齡組。您可以將年齡列使用整數:

BELexp$Age <- as.integer(gsub("[+]", "", BELexp$Age)) 

由於這些問題是長期R-HMD用戶的剋星,在HMD最近張貼在一個小,但越來越封裝在github上叫一些R裏面的函數(現在)DemogBerkeley。功能readHMD()刪除所有上述頭痛:

library(devtools) 
install_github("DemogBerkeley", subdir = "DemogBerkeley", username = "UCBdemography") 

BELexp <- readHMD("BEL.Exposures_1x1.txt") 

注意,新的指標列,叫做OpenInterval加入,而年齡被轉化成如上述整數。

相關問題