Добавить новый столбец (или фильтр), основанный на нескольких столбцах и удовлетворяющий нескольким условиям - PullRequest
0 голосов
/ 01 октября 2019

Это упрощенный пример «проблемы»

dt <- 
  read.table(textConnection("names age location
Ann  32     Glas
Annie  31       US
Anne  40     Glas
Kerri  31     Edin
David  39      Fra
Glas  29     Annie
Lindsay  24       US
Lynsey  37     Glas
Glas  Annie       US
Lila  39      Fra
Layla  37       US"), 
             header = TRUE, 
             sep = "", 
             stringsAsFactors = FALSE) %>% 
  as_tibble()

Я хочу добавить новый столбец под названием AnnGlas для каждой строки, где присутствуют «ann» и «glas»

Я знаю, как фильтровать по обоим, но не по обоим одновременно

dt %>% filter_all(any_vars(str_detect(str_to_lower(.), "glas|ann")))

Я могу найти совпадение по обоим, но не по обоим, используя apply

apply(dt, 2, function(x) str_detect(str_to_lower(x), "glas|ann"))

Мне нужночтобы найти какой-нибудь способ проверки, содержит ли какой-либо столбец строки глас, и если другой столбец содержит ann, чтобы я мог создать новый столбец

Вывод будет выглядеть следующим образом

  names   age   location desc 
   <chr>   <chr> <chr>    <lgl>
 1 Ann     32    Glas     TRUE 
 2 Annie   31    US       FALSE
 3 Anne    40    Glas     TRUE 
 4 Kerri   31    Edin     FALSE
 5 David   39    Fra      FALSE
 6 Glas    29    Annie    TRUE 
 7 Lindsay 24    US       FALSE
 8 Lynsey  37    Glas     FALSE
 9 Glas    Annie US       TRUE 
10 Lila    39    Fra      FALSE
11 Layla   37    US       FALSE

1 Ответ

1 голос
/ 01 октября 2019

Поскольку мы хотим, чтобы оба условия присутствовали, мы можем проверить оба из них по отдельности, используя lapply и Reduce. Совместная проверка шаблона может привести к выводу в виде TRUE, если в обоих столбцах присутствует только один из них.

dt$desc <- Reduce(`|`, lapply(dt, grepl, pattern = "Glas")) & 
            Reduce(`|`, lapply(dt, grepl, pattern = "Ann"))

dt
# A tibble: 11 x 4
#   names   age   location desc 
#   <chr>   <chr> <chr>    <lgl>
# 1 Ann     32    Glas     TRUE 
# 2 Annie   31    US       FALSE
# 3 Anne    40    Glas     TRUE 
# 4 Kerri   31    Edin     FALSE
# 5 David   39    Fra      FALSE
# 6 Glas    29    Annie    TRUE 
# 7 Lindsay 24    US       FALSE
# 8 Lynsey  37    Glas     FALSE
# 9 Glas    Annie US       TRUE 
#10 Lila    39    Fra      FALSE
#11 Layla   37    US       FALSE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...