grep для любой ячейки в data.frame - PullRequest
4 голосов
/ 25 января 2012

Простой вопрос "есть ли лучший путь"? Я хочу найти, если какая-либо ячейка в data.frame содержит подстроку, которую я ищу:

d=data.frame(V1=c("xxx","yyy","zzz"), V2=c(NA,"ewruinwe",NA))
grepl("ruin",d[2,2])  #TRUE
grepl("ruin",d)  #FALSE FALSE
any(grepl("ruin",as.character(as.matrix(d))))   #TRUE

Последняя строка делает то, что я хочу, но выглядит так некрасиво, что мне интересно, упустил ли я что-то попроще.

Справочная информация: d является одним из элементов t=readHTMLTable(url) (пакет XML). Я использовал подход d [2,2], чтобы проверить наличие сообщения об ошибке, и обнаружил, что веб-сайт иногда добавляет другую строку в таблицу HTML, помещая сообщение об ошибке, которое я искал, в другую ячейку.

ОБНОВЛЕНИЕ: так что, похоже, два варианта (благодаря математическому .coffee и Роману Луштрику):

any(grepl("ruin",as.matrix(d)))
any(apply(d, 2, function(x) grepl("ruin", x)))

1 Ответ

8 голосов
/ 25 января 2012

Как насчет этого?

d=data.frame(V1=c("xxx","yyy","zzz"), V2=c(NA,"ewruinwe",NA))
apply(d, c(1,2), function(x) grepl("ruin", x))
        V1    V2
[1,] FALSE FALSE
[2,] FALSE  TRUE
[3,] FALSE FALSE

Как отмечено в комментариях, "2" делает то же самое, что и "c (1,2)".Затем дать единственное логическое значение:

any(apply(d, 2, function(x) grepl("ruin", x)))
[1] TRUE
...