2013-12-13 24 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加入,而年龄被转化成如上述整数。

相关问题