问候stackoverflow R社区;
我从CDC下载了10个数据集,这些数据集与2003年至2013年的死亡率相对应。每年都是一个单独的数据集。某些数据集的扩展名为.DUSMCPUB,其他数据集的扩展名为.dat。我在github上找到了一个python脚本来解析2013.DUSMCPUB文件并将其导出到.csv。但是,我没有找到任何东西来读取.dat文件。我正在玩background: url(/images/Preloader_3.gif) center no-repeat #fff;
改变参数。当我在文本编辑器中打开.dat文件时,我得到了这个结果。
我期待这些数据的标题。但是,我确实阅读了文档,看看值的位置是否与文档有关,而不是。 我搜索CDC网站,希望找到有关如何读取文件的文档,或者从该文件导出的软件,或者可能有助于读取文件的一些信息,但没有找到我找到的文档。 Here我发现了一个类似的问题,但是,我的.dat不是文本,而且脚本对我不起作用。此外,我还没有成功地使用剧本。
你们中的任何人都使用过.dat格式的CDC数据集,可以就如何将这些数据导入RStudio提供一些指导吗?
我想更新一下我的问题。我找到了一个解决方案,我想与社区分享。甚至认为我很难找时间坐下来写一些代码。最后,我从github调整了一个python脚本。我能够解析.dat文件并将数据集导入R.我想感谢你们所有人!
data <- read.table(file = 'Mort03us.dat', header =TRUE, sep = ',')
此代码适用于Python 3。
答案 0 :(得分:2)
无论文件扩展名如何,它只是一个文本文件(88MB,行数为2.4M)。在检查时,它看起来是固定宽度的(宽430像素,有点宽,这里显示,虽然你的照片是正义的。)
唯一的&#34;技巧&#34;读取FWF文件是为了找到列宽。在一些&#34; dat&#34;文件,这是明确定义/记录的,但通常可以通过查看前几行来推断。在这种情况下,我只计算了字符。 (为简洁起见,我只抓了前100行。)
某些字段似乎以空格分隔。也就是说,一些(甚至大多数)行在两个分组之间有一个空格,但有些行没有。由于我不知道如何解码逻辑,我将它们保持在一起(与空间一起)。 (即:V6
,V8
和V9
。)
mort <- read.fwf("~/Downloads/foo/Mort03us.dat",
widths = c(30, 26, 6, 4, 7, 12, 24, 43, 9, 178, 3, 100, 4, 4, 36, 2),
header = FALSE, n = 100, stringsAsFactors = FALSE)
str(mort)
# 'data.frame': 100 obs. of 16 variables:
# $ V1 : chr " 11AK999AK9AK" " 11AK999AK9AK" " 11AK999AK9AK" " 11AK999AK9AK" ...
# $ V2 : chr " AK9999999992AK00009900OR" " AK9999999992AK00009900NY" " AK9999999992AK00009900WA" " AK9999999992AK00009900TX" ...
# $ V3 : chr " OR14" " NY17" " WA15" " TX16" ...
# $ V4 : int 1 1 1 1 1 1 1 1 1 1 ...
# $ V5 : chr " F1079" " F1088" " F1059" " F1084" ...
# $ V6 : chr " 412110 4W4" " 432311 1W6" " 371708 6D7" " 422210 4W7" ...
# $ V7 : chr " 2003U7UN" " 2003U7UN" " 2003U7UN" " 2003U7UN" ...
# $ V8 : chr " I361226" " I499228" " C64 117" " C349093" ...
# $ V9 : chr " 068 22" " 068 22" " 034 12" " 027 08" ...
# $ V10: chr " 0711I500 21I361 31I10 61I679 62I739 63M199 64N289 "| __truncated__ " 0311R568 21I959 31I499 "| __truncated__ " 0111C64 "| __truncated__ " 0111C349 "| __truncated__ ...
# $ V11: int 7 3 1 1 2 3 4 4 1 1 ...
# $ V12: chr " I10 I361 I500 I679 I739 M199 N289 " " I499 I959 R568 " " C64 " " C349 " ...
# $ V13: int 1 1 1 3 3 1 1 1 1 1 ...
# $ V14: int 11 11 11 23 23 11 11 11 11 11 ...
# $ V15: int 100 100 100 100 100 100 100 100 100 100 ...
# $ V16: int 6 6 6 8 8 6 6 6 6 6 ...
有很多空白区域,而read.fwf
功能并没有为您自动删除它,因此我们将不得不照顾下一个。
# chars <- sapply(mort, is.character)
mort[,chars] <- sapply(mort[,chars], function(z) {
gsub("[[:space:]]+", " ", trimws(z))
}, simplify = FALSE)
str(mort)
# 'data.frame': 100 obs. of 16 variables:
# $ V1 : chr "11AK999AK9AK" "11AK999AK9AK" "11AK999AK9AK" "11AK999AK9AK" ...
# $ V2 : chr "AK9999999992AK00009900OR" "AK9999999992AK00009900NY" "AK9999999992AK00009900WA" "AK9999999992AK00009900TX" ...
# $ V3 : chr "OR14" "NY17" "WA15" "TX16" ...
# $ V4 : int 1 1 1 1 1 1 1 1 1 1 ...
# $ V5 : chr "F1079" "F1088" "F1059" "F1084" ...
# $ V6 : chr "412110 4W4" "432311 1W6" "371708 6D7" "422210 4W7" ...
# $ V7 : chr "2003U7UN" "2003U7UN" "2003U7UN" "2003U7UN" ...
# $ V8 : chr "I361226" "I499228" "C64 117" "C349093" ...
# $ V9 : chr "068 22" "068 22" "034 12" "027 08" ...
# $ V10: chr "0711I500 21I361 31I10 61I679 62I739 63M199 64N289" "0311R568 21I959 31I499" "0111C64" "0111C349" ...
# $ V11: int 7 3 1 1 2 3 4 4 1 1 ...
# $ V12: chr "I10 I361 I500 I679 I739 M199 N289" "I499 I959 R568" "C64" "C349" ...
# $ V13: int 1 1 1 3 3 1 1 1 1 1 ...
# $ V14: int 11 11 11 23 23 11 11 11 11 11 ...
# $ V15: int 100 100 100 100 100 100 100 100 100 100 ...
# $ V16: int 6 6 6 8 8 6 6 6 6 6 ...
要考虑的最后一点是,一些超级宽的字段(V10
和V12
)似乎是可变的代码列表。由于我并不自信,我确切地知道多少等等,所以我选择将它们保持在一起。 (这是了解更多Hadley软件包的好时机,特别是broom
和purrr
。This youtube video是哈德利谈论使用这些嵌套数据框架的一小时包。)
(为了记录,加载整个文件并进行此处理需要一段时间,所以请耐心等待。我的建议是在整个文件的适度子集上练习&#34;以确保你的处理正在做你想要的。当你的步骤被绘制出来并进行测试时,然后运行它们并去喝咖啡。)