R将一个数字作为一个角色

时间:2013-12-13 21:43:27

标签: r

我正在尝试将一系列文本文件读入R.这些文件具有相同的形式,至少看起来是相同的形式。除了一个文件外,一切都很好。当我读取该文件时,R将所有数字视为字符。我使用as.numeric转换回来,但数据值已更改。我也尝试将文本文件转换为csv,然后读入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在读取文本文件时将一个数字视为一个字符,这很奇怪。

3 个答案:

答案 0 :(得分: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]

我怀疑是因为像这样的行而发生的:

   1842      110+           0.00         0.00         0.00 

因此,您需要确定您对保留110+值的兴趣程度。用我的方法,他们将被强迫NA。 (好吧,我认为他们会像你一样,但我得到了一个错误。所以需要这个多步骤的过程:

 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

答案 1 :(得分:1)

我通常阅读这些文件的方式是:

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

请注意,比利时在WWI中丢失了3年可能永远无法恢复的数据,因此这三年都是NAs,在这些文件中标有"."字符串。因此论证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的新指标列,而Age则按上述方式转换为整数。

答案 2 :(得分:0)

你能试试read.csv(...... stringsAsFactors = FALSE)吗?