2014-11-23 2 views
1

Я пытаюсь найти индексы в кадре данных, который содержит определенную строку. Но я бы хотел, чтобы моя строка была нечувствительной к регистру. Скажите, я хочу найти номер столбца в моем кадре данных COLUMN73, и я ожидаю, что он вернет 73, потому что это семьдесят третий столбец. У меня есть,«команда» в R с регистрозависимым

which(names(mydata) == "COLUMN73") 

Можно ли сделать мой поиск строки чувствительны к регистру так, чтобы получить 73, даже если я ищу скажем, CoLumN73?

Спасибо.

ответ

6

Вы можете конвертировать ваши имена в верхние регистры

which(toupper(names(mydata)) == "COLUMN73") 
+0

I мод YR кода (в моем ответе), так что я мог бы использовать один и тот же вход (вектор строк символов), как сделал Скривно. –

7

Можно индексировать его с grepl с помощью ignore.case аргумент

x <- c("col7", "COL73", "Col17", "CoL73", "cOl73") 
grepl("col73", x, ignore.case=TRUE) 
# [1] FALSE TRUE FALSE TRUE TRUE 

Аналогично, grep возвращает числовой индекс

grep("col73", x, ignore.case=TRUE) 
# [1] 2 4 5 

Для подмножеств столбцов фрейма данных

df[grepl("col73", names(df), ignore.case=TRUE)] 
+2

или 'grepl ("(? Я) col73", х)' – akrun

0

Полностью отредактированный с поправкой на код Уилла. Спасибо Дэвиду Аренбургу за это.

x <- rep(c("col7", "COL73", "Col17","COLUMN73", "CoL73", "cOl73"),1e4) 
scriven<- function(x) grepl("COLUMN73", x, ignore.case=TRUE) 
will<-function(x) which(toupper((x)) == "COLUMN73") 
microbenchmark(scriven(x),will(x)) 
Unit: milliseconds 
     expr  min  lq median  uq  max neval 
scriven(x) 30.55911 33.04852 34.91243 37.01039 39.59833 100 
    will(x) 26.10728 26.47967 27.21592 28.76291 30.46163 100 
+0

'x' - это безымянный вектор, и поэтому' toupper (names (x)) == "col73") 'возвращает только' NULL'. Также '' col73 "' не является верхним регистром, поэтому, когда вы делаете 'toupper', он ничего не будет соответствовать ... Это должно быть что-то вроде' which (toupper (x) == "COL73") 'и в этом случае Richard код также должен быть изменен. Вам нужно убедиться, что 'all.equal' возвращает' TRUE' для обоих решений –

+0

@DavidArenburg oops. Позвольте мне заново запустить все-верхний аргумент в соответствии с запросом OP. –

+0

Я думаю, вы должны изменить ответ Ричардса на 'grep' вместо' grepl', поэтому 'all.equal' вернет' TRUE', то есть 'scriven <- function (x) grep (" COLUMN73 ", x, ignore.case = TRUE), '. Извините за nugging –