2016-10-04 7 views
6

Я создал пример data.tableКак запустить функцию внутри 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 

Если я запускаю этот код

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

Я получаю таблицу с TRUE всякий раз, когда есть дата.

  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 

Но если я делаю это так:

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

Я просто получить этот результат:

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

Почему? Как я могу получить тот же результат, который записывается в скобках?

+0

PATT <- «^ \\ d \\ d ?/\\ d \\ d?/\\ d {4} $ " – skan

ответ

8

Нам нужно указать pattern аргумент, если мы не используем вызов анонимной функции

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

Или иначе с вызовом анонимной функции

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

Еще одна вещь, которую я пробовал, это моя [, grepl (patt, .SD)], но она не дает ожидаемого результата – skan

+1

@skan The. SD' - это список столбцов. 'grepl' работает на векторах или матрицах – akrun