首页 > 解决方案 > data.table fread NA 中不再允许“F”

问题描述

我有一个很大的 csv,我正在用 fread 阅读。直到最近,na 字符串可能包括“F”我更新到最新版本,这不再被允许。如何处理数字字段中带有 F 的记录?这在加拿大统计局的数据中很常见。使用带有数据表版本 1.11.2 的 r 3.5 发现问题。数据表版本 1.10.4.3 不反对 NA 字符串中的“F”。

这是一个示例文件

2010/01,纽芬兰和拉布拉多,,二手车经销商,”未调整 (x 1,000)”,v52367418,2.5.1,F 2010/02,纽芬兰和拉布拉多,,二手车经销商,“未调整 (x 1,000)”,v52367418 ,2.5.1,F 2010/03,纽芬兰和拉布拉多,,二手车经销商,”未经调整 (x 1,000)”,v52367418,2.5.1,F 2010/04,,,二手车经销商,”未经调整 ( x 1,000)",v52367418,2.5.1,F 2010/05,纽芬兰和拉布拉多,,二手车经销商,”未调整 (x 1,000)",v52367418,2.5.1,11466.0

当我尝试在此文件上使用 fread() 函数时,出现以下错误:

 library(data.table)
 dt <- fread("data.csv", na.strings=c('F'))
#Error in fread("data.csv", na.strings = c("F")) :
#  freadMain: NAstring <<F>> is recognized as type boolean, this is not permitted.

标签: rdata.tablefread

解决方案


我只会对输入进行预处理,或者对 data.table 进行后处理。对于您的示例数据,这是第二种方法:

dt <- fread(txt)   ## with txt being your input data

dt[V8 != "F", V8new := as.numeric(V8)]   # convert numeric
dt[V8 == "F", V8new := NA]               # flag rest as NA
dt[, V8 := NULL]                         # delete old column
setnames(dt, "V8new", "V8")              # rename

dt

这让我

R> dt[, 4:8]   ## more compact display
                 V4                   V5        V6    V7    V8
1: Used car dealers Unadjusted (x 1,000) v52367418 2.5.1    NA
2: Used car dealers Unadjusted (x 1,000) v52367418 2.5.1    NA
3: Used car dealers Unadjusted (x 1,000) v52367418 2.5.1    NA
4: Used car dealers Unadjusted (x 1,000) v52367418 2.5.1    NA
5: Used car dealers Unadjusted (x 1,000) v52367418 2.5.1 11466
R> 

推荐阅读