在Excel中导入未经过格式化的数据,并将杂乱的值强制为列名

时间:2015-04-19 11:18:50

标签: regex r excel import read.csv

我正在尝试使用以下代码导入一些公开的生活结果数据:

require(gdata)
# Source SIMD12 data zone level data
simd.sg.xls <- read.xls(xls = "http://www.gov.scot/Resource/0044/00447385.xls", 
                        sheet = "Quick Lookup", verbose = TRUE)

当然,导入的数据框看起来不太好: enter image description here 我想使用以下代码修改我的列名:

# Clean column names
names(simd.sg.xls) <- make.names(names = as.character(simd.sg.xls[1,]),
                                    unique = TRUE,allow_ = TRUE)

但它会产生相当不愉快的结果:

> names(simd.sg.xls)
 [1] "X1"       "X1.1"     "X771"     "X354"     "X229"     "X74"      "X67"      "X33"      "X19"      "X1.2"    
[11] "X6"       "X1.3"     "X8"       "X7"       "X7.1"     "X6506"    "X21"      "X1.4"     "X6158"    "X6506.1" 
[21] "X6506.2"  "X6506.3"  "X6263"    "X6506.4"  "X6468"    "X1010"    "X815"     "X99"      "X58"      "X65"     
[31] "X60"      "X6506.5"  "X21.1"    "X1.5"     "X6173"    "X5842"    "X6506.6"  "X6506.7"  "X6263.1"  "X6506.8" 
[41] "X6481"    "X883"     "X728"     "X112"     "X69"      "X56"      "X54"      "X6506.9"  "X21.2"    "X1.6"    
[51] "X6143"    "X5651"    "X6506.10" "X6506.11" "X6263.2"  "X6506.12" "X6480"    "X777"     "X647"     "X434"    
[61] "X518"     "X246"     "X436"     "X6506.13" "X21.3"    "X1.7"     "X6136"    "X5677"    "X6506.14" "X6506.15"
[71] "X6263.3"  "X6506.16" "X660"     "X567"     "X480"     "X557"     "X261"     "X456"  

我的问题是,是否有办法整齐地强制从第一行到列名称的值?由于我正在做大量的数据,我正在寻找易于重现的解决方案,我可以在实际的字符串中容纳很多违规,以获得语法正确的名称,但理想情况下,我会避免使用复杂的正则表达式,因为我经常阅读像这里链接的文件,不要被迫调整每个导入的规则。

1 个答案:

答案 0 :(得分:1)

看起来问题是标题位于第二行,而不是第一行。您可以包含skip=1参数,但使用read.xls处理此问题的更一般方法似乎是使用强制匹配第一行的patternheader参数pattern字符串将被视为header。您的代码变为:

require(gdata)
# Source SIMD12 data zone level data
simd.sg.xls <- read.xls(xls = "http://www.gov.scot/Resource/0044/00447385.xls", 
                        sheet = "Quick Lookup", verbose = TRUE, 
                        pattern="DATAZONE", header=TRUE)

更新

我没有收到您执行代码时发出的警告消息。消息引用了区域设置问题。我系统上的区域设置是:

Sys.getlocale()
[1] "LC_COLLATE=English_United States.1252;LC_CTYPE=English_United States.1252;LC_MONETARY=English_United States.1252;LC_NUMERIC=C;LC_TIME=English_United States.1252"

你的可能与众不同。区域设置数据可能取决于操作系统。我使用的是Windows 8.1。我也使用Strawberry Perl;你似乎正在使用别的东西。因此,警告信息存在差异的一些可能原因,但没有更具体的原因。

在评论的第二个问题上,要读取整个文件,并将特定行(在本例中为第2行)转换为列名,您可以使用以下代码:

simd.sg.xls <- read.xls(xls = "http://www.gov.scot/Resource/0044/00447385.xls", 
                        sheet = "Quick Lookup", verbose = TRUE, 
                        header=FALSE, stringsAsFactors=FALSE)

   names(simd.sg.xls) <- make.names(names = simd.sg.xls[2,],
                                   unique = TRUE,allow_ = TRUE)
   simd.sg.xls <- simd.sg.xls[-(1:2),]

所有数据都是字符类型,因此您需要根据需要转换为因子和数字。