将CDC death 2003中的.dat文件导入Rstudio

时间:2016-06-22 22:57:23

标签: r import dataset

问候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文件时,我得到了这个结果。

enter image description here

我期待这些数据的标题。但是,我确实阅读了文档,看看值的位置是否与文档有关,而不是。 我搜索CDC网站,希望找到有关如何读取文件的文档,或者从该文件导出的软件,或者可能有助于读取文件的一些信息,但没有找到我找到的文档。 Here我发现了一个类似的问题,但是,我的.dat不是文本,而且脚本对我不起作用。此外,我还没有成功地使用剧本。

你们中的任何人都使用过.dat格式的CDC数据集,可以就如何将这些数据导入RStudio提供一些指导吗?

2016年7月1日:

此问题的解决方案:

我想更新一下我的问题。我找到了一个解决方案,我想与社区分享。甚至认为我很难找时间坐下来写一些代码。最后,我从github调整了一个python脚本。我能够解析.dat文件并将数据集导入R.我想感谢你们所有人!

data <- read.table(file = 'Mort03us.dat', header =TRUE, sep = ',')

此代码适用于Python 3。

1 个答案:

答案 0 :(得分:2)

无论文件扩展名如何,它只是一个文本文件(88MB,行数为2.4M)。在检查时,它看起来是固定宽度的(宽430像素,有点宽,这里显示,虽然你的照片是正义的。)

唯一的&#34;技巧&#34;读取FWF文件是为了找到列宽。在一些&#34; dat&#34;文件,这是明确定义/记录的,但通常可以通过查看前几行来推断。在这种情况下,我只计算了字符。 (为简洁起见,我只抓了前100行。)

某些字段似乎以空格分隔。也就是说,一些(甚至大多数)行在两个分组之间有一个空格,但有些行没有。由于我不知道如何解码逻辑,我将它们保持在一起(与空间一起)。 (即:V6V8V9。)

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 ...

要考虑的最后一点是,一些超级宽的字段(V10V12)似乎是可变的代码列表。由于我并不自信,我确切地知道多少等等,所以我选择将它们保持在一起。 (这是了解更多Hadley软件包的好时机,特别是broompurrrThis youtube video是哈德利谈论使用这些嵌套数据框架的一小时包。)

(为了记录,加载整个文件并进行此处理需要一段时间,所以请耐心等待。我的建议是在整个文件的适度子集上练习&#34;以确保你的处理正在做你想要的。当你的步骤被绘制出来并进行测试时,然后运行它们并去喝咖啡。)