И операция grepl в R

Предположим, у меня есть следующий персонаж

c <- "1 NA NA 4 5 6 NA NA 9 10 NA NA 13 14 15 16 17 18 19 20 NA NA 23 NA NA NA NA"

Как я могу проверить, содержит ли он 1, 5 и 6? Без получения 15, 16 и т. д. как ложного срабатывания?


person Anton Belyanin    schedule 19.09.2016    source источник


Ответы (1)


Вы можете использовать границу слова \\b вокруг 1,5,6:

grepl("\\b[156]\\b", c)
# [1] TRUE

Если вы хотите проверить, все ли 1,5,6 содержатся в строке, вы можете векторизовать grepl в позиции шаблона:

all(Vectorize(grepl)(paste("\\b", c(1,5,6), "\\b", sep = ""), c))
# [1] TRUE

Когда мы удаляем 1 из строки:

c <- "NA NA 4 5 6 NA NA 9 10 NA NA 13 14 15 16 17 18 19 20 NA NA 23 NA NA NA NA"

grepl("\\b[156]\\b", c)   # this is or condition, will still give true
# [1] TRUE

all(Vectorize(grepl)(paste("\\b", c(1,5,6), "\\b", sep = ""), c))  # This gives FALSE since 
# pattern \\b1\\b is not there
# [1] FALSE
person Psidom    schedule 19.09.2016
comment
извините, что снова вас преследую - каков подход к добавлению двузначных чисел, например 15? Предположим, я хочу 1, 5, 6, 16 - person Anton Belyanin; 20.09.2016
comment
Вы можете добавить его к вектору как c(1,5,6,16) в функции вставки, которая создаст шаблон \\b16\\b для соответствия 16. - person Psidom; 20.09.2016
comment
последний вопрос: как правильно применить вашу функцию all(Vectorize(grepl)(paste(\\b, c(1,5,6), \\b, sep =), c)) к столбцу a данные.кадр? например, я хочу выяснить, соответствует ли каждая строка этому условию, чтобы подмножество тех, которые соответствуют - person Anton Belyanin; 20.09.2016
comment
Вы можете использовать outer. colSums(!outer(paste("\\b", c(1,5,6), "\\b", sep = ""), col, Vectorize(grepl))) == 0 предположим, что col = df$somecolumn — это столбец, который вы хотите протестировать. - person Psidom; 20.09.2016
comment
Я еще раз испытаю твое терпение. Для каждой строки я создаю вектор элементов, не относящихся к NA, для каждого c. как в этом примере это будет c(4, 5, 6, 9, 10, 13, 14, ...., 23). Но я думал, что получу все строки, содержащие одни и те же элементы, не относящиеся к NA, + что-нибудь еще за пределами маски, но, похоже, я ошибаюсь. Как я могу этого добиться? - person Anton Belyanin; 20.09.2016
comment
Я не думаю, что понимаю вашу идею. Это, кажется, расходилось с первоначальным вопросом. Вы можете задать отдельный вопрос с лучшим объяснением, если вы не возражаете, так как это в некоторой степени связано с фреймом данных. - person Psidom; 20.09.2016