R:readr:我如何为一个(有问题的)列(而不是全部)指定数据类型

R: readr: how can I specify a datatype for just one (problematic) column (and not all)

Readr 是一个很棒的包。但是人们懒得为每一列指定数据类型。 (例如,满分 30 个)。

检查解析失败可能会发现只有一列是关键问题。

见下文

fname='c:/q/net/SnomedCT_RF2Release_INT_20160131/Full/Terminology/sct2_Concept_Full_INT_20160131.txt'
> snm<-read_delim(fname,delim='\t')
Warning: 4016 parsing failures.
   row col   expected      actual
528950  id an integer 11000119105
528951  id an integer 11000119105
528952  id an integer 41000119109
528953  id an integer 61000119108
528954  id an integer 81000119104
...... ... .......... ...........
.See problems(...) for more details.
> probs<-problems(snm)
> table(probs$col)

  id 
4016 
> 

如何在我的数据集中指定一列(在我的例子中是列 id)的数据类型。 (待人品)

names(snm)
[1] "id"                 "effectiveTime"      "active"             "moduleId"           "definitionStatusId"

通过使用 cols 函数在 col_types 参数中指定该列,其余列保持原样。例如,要将 hp 列指定为 mtcars 中的字符,请使用 "c" 作为字符。

library(readr)
write_delim(mtcars, path = "test.txt")
test <- read_delim("test.txt", delim = " ", col_types = cols(hp = "c"))
str(test)

Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   32 obs. of  11 variables:
 $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl : int  6 6 4 6 8 6 8 4 4 6 ...
 $ disp: num  160 160 108 258 360 ...
 $ hp  : chr  "110" "110" "93" "110" ...
 $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
 $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
 $ qsec: num  16.5 17 18.6 19.4 17 ...
 $ vs  : int  0 0 1 1 0 1 0 1 1 1 ...
 $ am  : int  1 1 1 0 0 0 0 0 0 0 ...
 $ gear: int  4 4 4 3 3 3 3 4 4 4 ...
 $ carb: int  4 4 1 1 2 1 4 2 2 4 ...

readr 列类型插图中的更多信息https://cran.r-project.org/web/packages/readr/vignettes/column-types.html