【发布时间】:2019-06-21 15:52:55
【问题描述】:
我想读入一个大的固定宽度文件到 R。固定宽度文件包含两种类型的行。即:以“A”开头的行包含由一组宽度定义的变量,以“B”开头的行包含由另一组宽度定义的变量。基于mtcars的玩具示例:
AMazda RX4 21.0 160.0
BHornet 4 Drive 1 0 3
BHornet Sportabout 0 0 3
AMazda RX4 Wag 21.0 160.0
ADatsun 710 22.8 108.0
AHornet 4 Drive 21.4 258.0
BValiant 1 0 3
AHornet Sportabout 18.7 360.0
BDuster 360 0 0 3
目前,我使用两个readr::read_fwf 命令读取文件,并在读取As 后删除B 行,反之亦然。但是当然,对于一个固定宽度的大文件,这意味着两次读取数据。而且,如果A 中的一些字符串变量与B 中的一些数值变量在位置上重叠,那么read_fwf 的(最终)列类型错误,我必须处理下游(在下面的玩具示例)。
有什么聪明的想法可以提高速度和工作流程吗?
我目前的“解决方案”:
example <- "
AMazda RX4 21.0 160.0
BHornet 4 Drive 1 0 3
BHornet Sportabout 0 0 3
AMazda RX4 Wag 21.0 160.0
ADatsun 710 22.8 108.0
AHornet 4 Drive 21.4 258.0
BValiant 1 0 3
AHornet Sportabout 18.7 360.0
BDuster 360 0 0 3"
library(tidyverse)
library(readr)
in_a <- read_fwf(example, fwf_widths(c(1, 20, 4, 5), c("code", "name", "mpg", "disp"))) %>%
filter(code == "A")
in_b <- read_fwf(example, fwf_widths(c(1, 20, 4, 3, 3), c("code", "name", "vs", "am", "gear"))) %>%
filter(code == "B")
结果
> in_a
# A tibble: 5 x 4
code name mpg disp
<chr> <chr> <dbl> <dbl>
1 A Mazda RX4 21 160
2 A Mazda RX4 Wag 21 160
3 A Datsun 710 22.8 108
4 A Hornet 4 Drive 21.4 258
5 A Hornet Sportabout 18.7 360
> in_b
# A tibble: 4 x 5
code name vs am gear
<chr> <chr> <dbl> <dbl> <dbl>
1 B Hornet 4 Drive 1 0 3
2 B Hornet Sportabout 0 0 3
3 B Valiant 1 0 3
4 B Duster 360 0 0 3
【问题讨论】: