R data.table выбирает строки на основе частичного совпадения строк из вектора символов - PullRequest
0 голосов
/ 08 мая 2020

У меня есть вектор символов и data.tabe:

library(data.table)
pselection <- c("12345" , "2345", "12345678")
dt <- data.table("title"=c("First title", "Second Title", "Third Title", "Fourth Title"), 
                 "sha"=c("12345", "2345; 66543; 33423", "22222; 12345678;", "666662345; 444"))

Теперь я хочу выбрать все строки таблицы data.table, которые соответствуют столбцу sha, частично на основе разделителя ; . Итак, я хочу получить такой результат:

          title                sha
1:  First title              12345
2: Second Title 2345; 66543; 33423
3:  Third Title   22222; 12345678;

Как мне это сделать?

Я пробовал это:

selected <- dt[sha %in% pselection]

, но он выбирает только точные совпадения, а выражение %like% используется только для сопоставления одного выражения, а не многих. Конкатенация с регулярным выражением (например, paste(pselection, collapse="|")) не может быть и речи, потому что мой pselection> 10.000. Заранее спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Использование regex:

pselection <- paste0("\\b", pselection) # \b is boundary and includes ; and whitespace
dt[grepl(paste(pselection, collapse = "|"), sha)]

          title                sha
1:  First title              12345
2: Second Title 2345; 66543; 33423
3:  Third Title   22222; 12345678;
1 голос
/ 08 мая 2020

У меня есть решение, используя lapply и tstrsplit. Вероятно, это более элегантно, но оно выполняет свою работу

lapply(1:nrow(dt), function(i) {
  dt[i,'match' := any(trimws(tstrsplit(as.character(dt[i,'sha']),";")) %in% pselection)]
  })

dt[(match)]
          title                sha match
1:  First title              12345  TRUE
2: Second Title 2345; 66543; 33423  TRUE
3:  Third Title   22222; 12345678;  TRUE

Идея состоит в том, чтобы разделить каждую строку столбца sha (обрезать пробелы, иначе строка 3 не будет совпадать) и проверить, появляется ли sha

...