2016-10-04 13 views
6

Utworzyłem Przykładem data.tableJak uruchomić funkcję wewnątrz pliku data.table?

library(data.table) 
set.seed(1) 
siz <- 10 
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) 
) 

my[2,AA:=1] 


     NA wrong 3 11/11/2001 HELLO 
      1 wrong 2 11/11/2001 HELLO 
     NA wrong 6 11/11/2001 HELLO 
     NA wrong 10 11/11/2001 HELLO 
     NA wrong 5 11/11/2001 HELLO 
     NA wrong 7 11/11/2001 HELLO 
     NA wrong 8 11/11/2001 HELLO 
     NA wrong 4 11/11/2001 HELLO 
     NA wrong 1 11/11/2001 HELLO 
11/11/2001 wrong 9 11/11/2001 HELLO 

Jeśli ten kod

patt <- "^\\d\\d?/\\d\\d?/\\d{4}$" 
sapply(my, function(x) (grepl(patt,x))) 

ja dostać stolik z TRUE ilekroć jest data.

  AA BB CC DD EE 
[1,] FALSE FALSE FALSE TRUE FALSE 
[2,] FALSE FALSE FALSE TRUE FALSE 
[3,] FALSE FALSE FALSE TRUE FALSE 
[4,] FALSE FALSE FALSE TRUE FALSE 
[5,] FALSE FALSE FALSE TRUE FALSE 
[6,] FALSE FALSE FALSE TRUE FALSE 
[7,] FALSE FALSE FALSE TRUE FALSE 
[8,] FALSE FALSE FALSE TRUE FALSE 
[9,] FALSE FALSE FALSE TRUE FALSE 
[10,] TRUE FALSE FALSE TRUE FALSE 

Ale jeśli mogę to zrobić tak:

my[,lapply(.SD, grepl, patt)] 

ja po prostu ten wynik:

AA BB CC DD EE 
1: NA FALSE FALSE FALSE FALSE 

Dlaczego? Jak mogę uzyskać ten sam wynik, pisząc wszystko w nawiasach?

+0

patt <- „^ \\ d \\ d ?/\\ d \\ d?/\\ d {4} $ " – skan

Odpowiedz

8

Musimy określić pattern argument, jeśli nie używamy anonimowy wywołanie funkcji

my[,lapply(.SD, grepl, pattern = patt)] 

lub w inny sposób z anonimowym wywołania funkcji

my[,lapply(.SD, function(x) grepl(patt, x))] 
+0

Inną rzeczą, której spróbowałem, była moja [, grepl (patt, .SD)], ale nie daje oczekiwanego wyniku. – skan

+1

@skan'. SD' to lista kolumn. 'grepl' działa na wektorach lub macierzach – akrun