在 Excel 中导入未格式化的数据并强制使用杂乱的值作为列名
Importing unfriedly formatted data in Excel and forcing messy values as column names
我正在尝试使用以下代码导入一些公开可用的生活结果数据:
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"
我的问题是是否有办法巧妙地将值从第一行强制到列名?由于我正在处理大量数据,因此我正在寻找易于重现的解决方案,我可以适应实际字符串的大量违规行为以获得语法正确的名称,但理想情况下我会避免使用复杂的正则表达式,因为我我经常阅读像此处链接的文件这样的文件,并且不想被迫为每次导入调整规则。
看起来问题是 header 在第二行,而不是第一行。您可以包含一个 skip=1
参数,但使用 read.xls
处理此问题的更通用方法似乎是使用 pattern
和 header
参数强制第一行匹配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"
你的可能不一样。语言环境数据可能 OS 相关。我正在使用 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),]
所有数据都是字符类型,因此您需要根据需要转换为因子和数字。
我正在尝试使用以下代码导入一些公开可用的生活结果数据:
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"
我的问题是是否有办法巧妙地将值从第一行强制到列名?由于我正在处理大量数据,因此我正在寻找易于重现的解决方案,我可以适应实际字符串的大量违规行为以获得语法正确的名称,但理想情况下我会避免使用复杂的正则表达式,因为我我经常阅读像此处链接的文件这样的文件,并且不想被迫为每次导入调整规则。
看起来问题是 header 在第二行,而不是第一行。您可以包含一个 skip=1
参数,但使用 read.xls
处理此问题的更通用方法似乎是使用 pattern
和 header
参数强制第一行匹配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"
你的可能不一样。语言环境数据可能 OS 相关。我正在使用 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),]
所有数据都是字符类型,因此您需要根据需要转换为因子和数字。