Как использовать ignore.case и заканчивается вместе? - PullRequest
0 голосов
/ 25 сентября 2019

Вот мой фрейм данных:

df <- data.frame(a = c(1,2,3), b = c("aC", "ab", "ac"), stringsAsFactors = F)
#  a  b
#1 1 aC
#2 2 ab
#3 3 ac

Требуемый вывод:

#a b
#1 aC
#3 ac

Условие состоит в том, чтобы фильтровать строки, оканчивающиеся на "c" (без учета регистра),

Я пытался использовать ignore.case из пакета searchable следующим образом, но он не дает желаемого результата.

library(searchable)
df[endsWith(ignore.case(df$b), "c"), ]
#df[endsWith(df$b, ignore.case("c")), ]
#  a  b
#3 3 ac

Я хочу придерживаться endsWith настолько, насколько это возможно, поскольку у меня уже есть другие функции в зависимости от этого.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 25 сентября 2019
df[endsWith(tolower(df$b), "c"),]
#OR
df[grepl(".*c$", df$b, ignore.case = TRUE),]
#OR
df[substring(df$b, nchar(df$b), nchar(df$b)) %in% c("c", "C"),]
#  a  b
#1 1 aC
#3 3 ac
1 голос
/ 25 сентября 2019

Вы можете использовать (?i)c$ TRE (библиотека регулярных выражений по умолчанию в базовых функциях регулярных выражений R) с grepl:

df <- data.frame(a = c(1,2,3), b = c("aC", "ab", "ac"), stringsAsFactors = F)
df[grepl("(?i)c$", df$b),]
#  a  b
#1 1 aC
#3 3 ac

Если у вас динамическая шаблон со специальными символами регулярных выражений, которые вы могли бы сначала избежать этого.Чтобы проверить, заканчивается ли строка на C., c) или c(, вы можете использовать:

regex.escape <- function(string) {
  gsub("([][{}()+*^$|\\\\?.])", "\\\\\\1", string)
}
vals <- c("C.", "c)", "c(")
rx <- paste0("(?i)(?:", paste(regex.escape(vals), collapse="|"), ")$") # => "(?i)(?:C\\.|c\\)|c\\()$"

df <- data.frame(a = c(1,2,3,4), b = c("C.", "c)", "c(", "c"), stringsAsFactors = F)
df[grepl(rx, df$b),]
#   a  b
# 1 1 C.
# 2 2 c)
# 3 3 c(

(?i)c$ означает:

  • (?i)- ignore.case флаг встроенного модификатора
  • c - буквенный символ
  • $ - маркер конца строки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...