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

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

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) 

当然,导入的数据框不好看: 在这里输入图像说明 我想用下面的代码修改我的列名:

 # 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" 

我的问题是,如果有一种方法来整齐强制从第一行到列名的值? 由于我正在做大量的数据,我正在寻找可以很容易重现的解决scheme,我可以容忍很多违反实际的string来获得语法正确的名字,但理想情况下,我会避免与精心制作的正则expression式通常阅读的文件就像这里链接的文件一样,不会被迫为每个单一的导入调整规则。

看起来问题是头是在第二行,而不是第一行。 你可以包含一个skip=1参数,但是使用read.xls的更一般的处理方式似乎是使用patternheader参数,强制匹配patternstring的第一行被视为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) 

UPDATE

执行代码时,我不会收到警告消息。 这些消息引用了区域设置的问题。 我的系统上的区域设置是:

 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。 另外我正在使用草莓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),] 

所有数据将是字符types,因此您需要根据需要将其转换为因子和数字。