data.table
Функция fread
идеально подходит для этого, особенно с учетом размера данных.
Если мы загрузим рассматриваемый файл, мы можем сначала распаковать его в R, а затем прочитать егоin, используя data.table
:
library(data.table)
file <- unzip("./UKB_AD_sumstats_17May2018.zip")
f1 <- fread(file[2])
SNP A1 A2 BETA SE P DIR CHR BP
1: 1:101166253_TG_T T TG -0.0076 0.0114 0.50360 -+ 1 101166253
2: 1:102884223_A_G A G -0.0037 0.0102 0.71920 -- 1 102884223
3: 1:105351556_C_T T C -0.0034 0.0099 0.72850 -+ 1 105351556
4: 1:105412363_T_C T C 0.0115 0.0105 0.27400 +- 1 105412363
5: 1:105413338_A_G A G 0.0083 0.0099 0.40350 ++ 1 105413338
---
7795601: rs9999993 A T 0.0050 0.0100 0.62050 ++ 4 98562671
7795602: rs9999995 A G -0.0012 0.0102 0.90980 -+ 4 185171608
7795603: rs9999996 A C -0.0257 0.0104 0.01376 -- 4 69782467
7795604: rs9999997 A G -0.0057 0.0100 0.56740 +- 4 163870478
7795605: rs9999998 T C -0.0004 0.0102 0.96540 -+ 4 117161848
Если мы запустим fread
с verbose = TRUE
, мы увидим, что:
Detecting sep automatically ...
sep=' ' with 100 lines of 9 fields using quote rule 0
Таким образом, рассматриваемый файл разделен пробелом.
Я также из любопытства выполнил тест, чтобы посмотреть, насколько лучше fread
обработал размер данных.Сначала я попытался запустить read.table
без указания colClasses
, и после нескольких минут наблюдения за вращением колеса мыши я сдался.Я вернулся и добавил skip = 1
и вектор colClasses
:
library(rbenchmark)
benchmark( "fread" = { f1 <- fread(file)},
"read.table" = { f2 <- read.table(file, sep = " ", colClasses = c("character", "character", "character", "numeric", "numeric", "numeric", "character", "integer", "integer"), skip = 1)},
replications =1)
test replications elapsed relative user.self sys.self user.child sys.child
1 fread 1 2.04 1.000 3.64 0.18 NA NA
2 read.table 1 17.20 8.431 16.03 1.13 NA NA
Для этого набора данных fread
примерно в 8 раз быстрее, чем read.table
.