Как использовать GREPL со строкой из столбца, как шаблон в R - PullRequest
3 голосов
/ 28 апреля 2020

Я работаю с R и пытаюсь очистить свои данные, используя. У меня есть следующие данные:

example<- data.frame(x=c("hungry","fly","day","dog"),
                        y=c("i'm hungry","i believe i can fly","a hard day's night","cat"))

Я пытаюсь определить, содержит ли столбец Y символы из столбца X. Я пытаюсь с помощью grepl (), но эта функция не работает с векторами, и я попробуй с str_detect() но я не знаю почему не работает. Наконец я пытаюсь получить следующую таблицу:

      x                   y        Flag
1 hungry          i'm hungry          1
2    fly i believe i can fly          1
3    day  a hard day's night          1
4    dog                 cat          0

Интересно, может ли кто-нибудь дать мне какой-то вариант или другое представление, чтобы сделать это.

Спасибо!

Ответы [ 3 ]

1 голос
/ 28 апреля 2020

Вы можете использовать grepl и ifelse следующим образом:

example$Flag <- ifelse(grepl(paste0(example$x, collapse = "|"), example$y), 1, 0)

Используя paste0, это объединяет example$x в один шаблон с альтернативами, разделенными | и имеет grepl проверить, соответствует ли комплекс шаблонов значениям в example$y: если совпадение найдено, оператор ifelse присваивает 1; если это не так, 0.

В качестве альтернативы вы можете использовать str_detect из пакета stringr: обратите внимание, что порядок, в котором вы присваиваете две переменные функции, имеет значение - вам нужно поместить строки большего размера (т.е. в example$y) сначала И вам нужно преобразовать обе переменные в символ. С другой стороны, нет необходимости в преобразовании paste0:

example$Flag <- ifelse(str_detect(as.character(example$y), as.character(example$x)), 1, 0)

Результат:

example
       x                   y  Flag
1 hungry          i'm hungry     1
2    fly i believe i can fly     1
3    day  a hard day's night     1
4    dog                 cat     0
1 голос
/ 28 апреля 2020

Вы можете попробовать Vectorize, чтобы сделать grepl веркорным, например,

example <- within(example,Flag <- +Vectorize(grepl)(x,y))

таким, что

> example
       x                   y Flag
1 hungry          i'm hungry    1
2    fly i believe i can fly    1
3    day  a hard day's night    1
4    dog                 cat    0
1 голос
/ 28 апреля 2020

Не так близко, как ответ @ jo go, но:

sapply(split(example, rownames(example)), 
       function(z){grepl(as.character(z$x), as.character(z$y))})
...