2015-12-30 20 views
2

У меня есть фрейм данных и вы хотите, чтобы grep имена столбцов соответствовали определенным шаблонам. У меня есть четыре набора шаблонов:grep pattern для имен столбцов

# set 1 (underscore, no A) 
    cat1_1 
    cat12_12 

# set 2 (underscore, A) 
    cat4_4A 
    cat18_18A 

# set 3 (no underscore, no p) 
    dog2 
    dog12 

# set 4 (no underscore, p) 
    dog2p 
    dog12p 

Мой фактический кадр данных содержит разное количество столбцов в наборе, но я показываю только две колонки в комплект в этом примере для простоты.

ex <- data.frame(cat1_1=c("1a", "1a"), 
       cat12_12=c("1b", "1b"), 
       cat4_4A=c("2a", "2a"), 
       cat18_18A=c("2b", "2b"), 
       dog2=c("3a", "3a"), 
       dog12=c("3b", "3b"), 
       dog2p=c("4a", "4a"), 
       dog12p=c("4b", "4c")) 
ex 
#  cat1_1 cat12_12 cat4_4A cat18_18A dog2 dog12 dog2p dog12p 
#1  1a  1b  2a  2b 3a 3b 4a  4b 
#2  1a  1b  2a  2b 3a 3b 4a  4c 

Я хочу Grep names(ex) так что я захватить весь набор 1 переменных, то по отдельности, все установлены 2 переменных, и так далее. Так, например, grep(PATTERN, names(ex)) для набора 1 должен возвращать:

[1] "cat1_1" "cat12_12"

Я ценю помощь с шаблоном Grep для каждого набора. Одним из ограничений является то, что я не хочу изменять имена столбцов.

ответ

1

На примере показано на ОР, если нам нужно найти закономерности в COLNAMES, что начало (^) с «кошкой», за которым следует один или несколько номеров (\\d+), а затем подчеркивание (\\_), а затем один или несколько чисел ('\ d +') до конца строки ($), мы получаем 'cat1_1', 'cat12_12'.

Аналогичная логика может использоваться для других случаев.

grep('^cat\\d+\\_\\d+[A-Z]+$', names(ex), value= TRUE) 
grep('^dog\\d+$', names(ex), value=TRUE) 
grep('^dog\\d+[a-z]+$', names(ex), value=TRUE) 

Или другой вариант был бы split имена столбцов путем создания группировки переменной на основе names(ex)

split(names(ex), gsub('\\d+(?=\\_)|(?<=\\_)\\d+|(?<=[a-z])\\d+', 
          '1', names(ex), perl=TRUE)) 
#$cat1_1 
#[1] "cat1_1" "cat12_12" 

#$cat1_1A 
#[1] "cat4_4A" "cat18_18A" 

#$dog1 
#[1] "dog2" "dog12" 

#$dog1p 
#[1] "dog2p" "dog12p" 
+0

спасибо, @akrun! если вы не возражаете, не могли бы вы объяснить логику первых двух? надеюсь, я смогу использовать этот пример для обобщения в других ситуациях. –

+1

замечательный. это очень ясно. Я действительно ценю твою помощь. –

1

Рассмотрим с использованием начинается с ^ и заканчивается $regex:

names(ex)[grep("^cat.*[0-9]$", names(ex))] 

names(ex)[grep("^cat.*A$", names(ex))] 

names(ex)[grep("^dog.*[0-9]$", names(ex))] 

names(ex)[grep("^dog.*p$", names(ex))] 
+0

Я не думаю, что '[' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'собаки, они? –

0

В качестве поправки к хорошим ответам до сих пор R имеет некоторые «специальные» строки, которые могут облегчить переход к использованию регулярных выражений. Например, [:digit:] будет соответствовать любому численному значению, а [:alpha:] будет соответствовать любому алфавитному символу.

Если мы применим это к типам имен четыре колонки, которые вы работаете с мы получаем следующее:

grep("^cat[[:digit:]]+_[[:digit:]]+$", names(ex), value=TRUE) 
# "cat1_1" "cat12_12" 

grep("^cat[[:digit:]]+_[[:digit:]]+A$", names(ex), value=TRUE) 
# "cat4_4A" "cat18_18A" 

grep("^dog[[:digit:]]+$", names(ex), value=TRUE) 
# "dog2" "dog12" 

grep("^dog[[:digit:]]+p$", names(ex), value=TRUE) 
# "dog2p" "dog12p" 

Обратите внимание, что мы должны приложить [:digit:] в другом наборе квадратных скобок, чтобы правильно очертить круг значения, которые он представляет, но, по крайней мере, я думаю, что это немного более читаемо новичкам, чем двойным escape-символам, таким как \\d (хотя в какой-то момент вы устанете от ввода дополнительных символов: D).

Полный список этих «специальных» строк и другой полезной информации о регулярных выражениях в R, я бы рекомендовал проверить this link из базовой документации R.

Смежные вопросы