#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")