微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

R : 在 read_fwf

如何解决R : 在 read_fwf

我发现了一个非常奇怪的现象,read_fwftidyr::separate 相关联。 tidyr::separate 在处理 read_fwf 导入的数据时速度慢得要命,但如果使用 read_delim 导入相同的数据则不然。

这是重现问题的方法。唯一的方法是下载原始文件https://www.riziv.fgov.be/webprd/appl/pDownloadcenter/download/ProductionTXT-Base-Full-2021-07-01.zip。抱歉,我没能通过 dput 做到这一点:如果我在用 dput(head(object,20)) 加载的对象上执行 read_fwf 并且在用 read_delim 加载后在同一个对象上执行,结果是完全一样,如果我从 dput 生成代码中加载数据,就没有问题了。所以我不知道如何在没有原始文件的情况下为您提供可复制的示例。我有 readr 2.0.0tidyr 1.1.3R 4.1.0

这里,对于由 read_fwf 导入的对象,separate 需要 1min10 :

library(tidyverse)
options(encoding = "UTF-8")

# I import with read_fwf
d21_HCW <- read_fwf (
  file = "SZVBaseHCW_Full_2021-07-01_ano.txt",fwf_positions (c(1,35,43,53,55),c(34,42,52,54,NA)),locale = locale(encoding = 'latin1')
)

# I separate in new columns a part of the data
d21_HCW_type11 <- filter(d21_HCW,X4 == 11) %>%
  separate(X5,sep = c(6,17,65,77,89,97,105,106,107,113,115,147,151,155,160,165),into = c("INAMI","registre","nom","prenom1","prenom2","birthdate","deces","langue","sexe","INAMI2","check_INAMI2","rue_t11","num_rue_t11","num_boite_t11","code_postal_t11","code_INS_t11","localite_t11")
           )

但是如果我以 CSV 格式导出数据,然后使用 read_delim 重新导入它,那么 separate 再次快速工作...在这种情况下,separate 需要 6 秒:

# I write data in a CSV
write.csv2(d21_HCW,file = "SZVBaseHCW_Full_2021-07-01_ano.csv")

# I import data again with read_delim
d21_HCW <- read_delim("SZVBaseHCW_Full_2021-07-01_ano.csv",delim = ";",escape_double = FALSE,col_types = cols(...1 = col_skip()),trim_ws = TRUE)

# I do separate again
d21_HCW_type11 <- filter(d21_HCW,"localite_t11")
           )

知道为什么会有这种奇怪的行为吗? 我已经找到了 read_delim 的解决方案,我发布了这个问题是为了好奇地知道发生了什么。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。