Поиск списка в R без учета регистра - PullRequest
29 голосов
/ 15 апреля 2011

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

Ответы [ 6 ]

39 голосов
/ 15 апреля 2011

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

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

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

28 голосов
/ 15 апреля 2011

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

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

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

5 голосов
/ 13 июня 2018

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

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

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

str_detect(colnames(iris), "(?i)species")
1 голос
/ 19 апреля 2015

Пакет 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

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

0 голосов
/ 28 февраля 2018

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

library("stringr")
str_which(string = tolower(colnames(iris)), pattern = "species")
0 голосов
/ 30 апреля 2016

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

s1 = c("a", "b")
s2 = c("B", "C")
matches = s1[ toupper(s1) %in% toupper(s2) ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...