Van egy nagy adatkészletem, 5000 változó és 3 millió sorom. Meg akarom nézni, hogy mely oszlopok tartalmaznak dátumokat. A data.table fájllal dolgozom, és az adatokat a fread
segítségével olvasom. A következőt futtatom, hogy megtudjam, mely oszlopok tartalmaznak dátumokat:
my[, lapply(.SD,function(xx)
length(grep("^\\d\\d?/\\d\\d?/\\d{4}$",xx))>0 ) ]
vagy ugyanez any(grepl())
De nagyon lassú.
Van valami mód gyorsabban megcsinálni? Lehet, hogy megállásra kényszeríti grep
-et, amikor először találkozik randevúzással? Szerintem (parancssor) a grepnek van egy lehetősége erre:
grep -m 1
De szerintem R-ben nem elérhető.
Bármilyen ötlete? Az alap R-es vagy más csomagokkal rendelkező megoldásokat is szívesen fogadjuk.
A data.table csak néhány sorával is dolgozhatok, de egyes oszlopok nagyon kevés értéket tartalmazhatnak, amelyek eltérnek az NA-tól, és előfordulhat, hogy ezek hiányoznak.
Nagyon egyszerű példa néhány NA-val:
library(data.table)
set.seed(1)
siz <- 10000000
my <- data.table(
AA=c(rep(NA,siz-1),"11/11/2001"),
BB=sample(c("wrong", "11/11/2001"),siz, prob=c(1000000,1), replace=T),
CC=sample(siz),
DD=rep("11/11/2001",siz),
EE=rep("HELLO", siz)
)
Láttam, hogy létezik egy perl = FALSE opció, de nem tudom, hogy ez lehetővé teszi-e további paraméterek hozzáadását.
Vagy hasonlóképpen szeretném tudni, hogy a dátumnak vélt fájlok között vannak-e furcsa szimbólumok. Minden oszlopon futtathatnám a grep-et, de nagyon jó lenne, ha meg tudnám állni, amint a tesztem megfelelő lesz, anélkül, hogy az oszlop végéig folytatnám.
Esetleg valamilyen extra csomaggal, például stringivel?
.SDcols = sapply(dat, is.character)
is beállítható, mivel a fread megpróbál számokat, egészeket stb. azonosítani (így általában nem minden col karakter, úgy értem). 02.10.2016patt = "\\d{2}/\\d{2}/\\d{4}"; system.time( sapply(my, function(x) is.character(x) && length(grep(patt, unique(na.omit(x)))) ) )
kevesebb mint egy másodpercet vesz igénybe a számítógépemen a példádhoz. Nem biztos benne, hogy erre vágyik. 02.10.2016user system elapsed 0.61 0.29 0.89
-t kapok az új adatkészlethez. 02.10.2016