Поиск по списку без учета регистра в R

#r

#r

Вопрос:

Могу ли я выполнить поиск по списку символов для строки, в которой я не знаю, как строка оформляется в регистре? Или, в более общем плане, я пытаюсь ссылаться на столбец в dataframe, но я не знаю точно, как оформляются столбцы. Я думал выполнить поиск names(myDataFrame) без учета регистра, чтобы вернуть правильный регистр столбца.

Ответ №1:

Я бы предложил grep() функцию и некоторые из ее дополнительных аргументов, которые делают ее приятной в использовании.

 grep("stringofinterest",names(dataframeofinterest),ignore.case=TRUE,value=TRUE)
  

без аргумента value=TRUE вы получите только вектор позиций индекса, в которых произошло совпадение.

Ответ №2:

Предполагая, что нет имен переменных, которые различаются только регистром, вы можете выполнить поиск по имени переменной в нижнем регистре в tolower(names(myDataFrame)) :

 match("b", tolower(c("A","B","C")))
[1] 2
  

Это приведет только к точным совпадениям, но в данном случае это, вероятно, желательно.

Комментарии:

1. Пакет с возможностью поиска, который позволяет включить сопоставление без учета регистра.

Ответ №3:

С помощью stringr пакета вы можете модифицировать шаблон с помощью одной из встроенных функций-модификаторов (см. `?модификаторы). Например, поскольку мы сопоставляем фиксированную строку (без специальных символов регулярного выражения), но хотим игнорировать регистр, мы можем сделать

 str_detect(colnames(iris), fixed("species", ignore_case=TRUE))
  

Или вы можете использовать (?i) модификатор без учета регистра

 str_detect(colnames(iris), "(?i)species")
  

Комментарии:

1. Также все модификаторы из ?stringr::modifiers имеют ignore.case в качестве второго аргумента, так что здесь, например, вы можете ввести str_detect(colnames(iris), fixed("species",ignore_case=TRUE))

2. Я заглянул в документ stringr и не нашел документально подтвержденного такого поведения, откуда вы это взяли?

3. Это довольно стандартные модификаторы регулярных выражений: regular-expressions.info/modifiers.html

4. да, но grepl похоже, что он их не поддерживает, поэтому я предположил, что он был закодирован в stringr или stringi

5. grepl выполняется с perl=TRUE : grepl("(?i)species", colnames(iris), perl=TRUE)

Ответ №4:

Для всех, кто использует это с %in% , просто используйте tolower с правой (или обеих) сторон, вот так:

 "b" %in% c("a", "B", "c")
# [1] FALSE

tolower("b") %in% tolower(c("a", "B", "c"))
# [1] TRUE
  

Ответ №5:

searchable Пакет был создан для обеспечения различных типов поиска внутри объектов:

 l <- list( a=1, b=2, c=3 )
sl <- searchable(l)        # make the list "searchable"
sl <- ignore.case(sl)      # turn on case insensitivity

> sl['B']
$b
[1] 2
  

Он работает со списками и векторами и делает намного больше, чем простое сопоставление без учета регистра.

Ответ №6:

Если вы хотите выполнить поиск одного набора строк в другом наборе строк без учета регистра, вы могли бы попробовать:

 s1 = c("a", "b")
s2 = c("B", "C")
matches = s1[ toupper(s1) %in% toupper(s2) ]
  

Ответ №7:

Другим способом достижения этой цели является использование str_which(string, pattern) из stringr пакета:

 library("stringr")
str_which(string = tolower(colnames(iris)), pattern = "species")