将每个人的可变长度文本文件导入 R

Importing Variable length text files per individual into R

我想将一个非常大的文本文件作为数据框导入 R。该文件由比利时“国家健康和残疾保险研究所”制作,可在此处下载:https://www.riziv.fgov.be/webprd/appl/pDownloadcenter/download/ProductionTXT-Base-Full-2021-07-01.zip。 zip 文件中我感兴趣的文件是“SZVBaseHCW_Full_2021-07-01_ano.txt”。它包含比利时卫生专业人员的个人数据。

这是一个固定宽度的文本文件,我通常用“read_fwf”导入这种数据。问题是文件的结构有点棘手:

这是一个虚构的结构示例,非常简单。 “前缀部分”是 0000xxx 部分。前 5 个字符表示个人。 “前缀部分”的最后 2 个字符指定行的“类型”。每行包含特定于该“类型”的数据,分为变量(变量的宽度结构在注释中指示):

0000111abaabacd
0000112abbbba
0000113ccaxyzzghj5
0000211acatbacz
0000212zbabba
0000311tyyyuacd
0000312xbbiop
0000411pkggbacz

#type 11 has 3 variables. Width for each : 2,3,3
#type 12 has 2 variables. Width for each : 3,3
#type 13 has 4 variables. Width for each : 3,3,1,4

所以,我想做的是将每个人导入到 R 中的数据框中,将每个人导入到一个唯一的行中,并将每种类型的所有变量都导入到单独的列中。如果缺少变量(因为没有type/row),我想为每个变量指示空数据(NA)。

id     var1  var2  var3  var4  var5  var6  var7  var8  var9
00001    ab   aab   acd   abb   bba   cca   xyz     z  ghj5
00002    ac   atb   acz   zba   bba    NA    NA    NA    NA  
00003    ty   yyu   acd   xbb   iop    NA    NA    NA    NA
00004    pk   ggb   acz    NA    NA    NA    NA    NA    NA

我有点迷茫,不知道从何说起,因为这个结构对我来说真的很不习惯。您有什么想法或建议吗?

非常感谢!

假设最后在注释中可重复显示的输入将其读作 3 个字段,然后重新整形为宽格式,每种类型一列。最后将每个这样的列中的字段分开。

library(dplyr)
library(readr)
library(tidyr)

cols <- fwf_cols(id = 5, type = 2, misc = NA)

# DF <- read_fwf("myfile", cols)
DF <- read_fwf(Lines, cols)

DF %>%
  pivot_wider(names_from = "type", values_from = "misc") %>%
  separate(`11`, c("var1", "var2", "var3"), cumsum(c(2, 3, 2))) %>%
  separate(`12`, c("var4", "var5"), cumsum(c(3, 3))) %>%
  separate(`13`, c("var6", "var7", "var8", "var9"), cumsum(c(3, 3, 1, 4)))

给予:

# A tibble: 4 x 10
  id    var1  var2  var3  var4  var5  var6  var7  var8  var9 
  <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 00001 ab    aab   ac    abb   bba   cca   xyz   z     ghj5 
2 00002 ac    atb   ac    zba   bba   <NA>  <NA>  <NA>  <NA> 
3 00003 ty    yyu   ac    xbb   iop   <NA>  <NA>  <NA>  <NA> 
4 00004 pk    ggb   ac    <NA>  <NA>  <NA>  <NA>  <NA>  <NA> 

备注

Lines <- "0000111abaabacd
0000112abbbba
0000113ccaxyzzghj5
0000211acatbacz
0000212zbabba
0000311tyyyuacd
0000312xbbiop
0000411pkggbacz"