Заменить все выражение, содержащее определенную строку

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

d <- c("harry11_scott80_norm.avi","harry11_norm.avi","harry11_scott80_lpf.avi", 
       "joel51_lpf.avi","rich82_joel51_lpf.avi")

Я хочу, чтобы R заменил все выражения с именами двух людей, такими как harry11_scott80_norm.avi, на выражение incongruent, а все выражения с одним именем человека, например harry11_norm.avi, на congruent. Я мог бы использовать gsub для этого:

dd <- gsub("harry11_scott80_norm.avi", "incongruent", d) 

но у меня много таких имен, так что это было бы очень неуклюжим решением. Поэтому в идеале я хочу заменить ВСЕ выражение, содержащее такие строки, как _scott80_, на «несовместимое». Я думал, что gsub может это сделать, но когда я его запускаю:

dd <- gsub("_scott80_", "incongruent", d)

он возвращается с harry11incongruentnorm.avi, что, очевидно, потому, что он просто заменяет точное совпадение строки. Я думаю, что есть какой-то способ сказать gsub полностью заменить выражение, содержащее выбранную строку, но я не могу его найти.

Был вопрос Как в R заменить строку, содержащую определенный шаблон, другой строкой?, но я не уверен, как использовать agrep в этом контексте.


РЕДАКТИРОВАТЬ: Побочный бонусный вопрос - на основе ответа @GSee, есть ли какая-либо функция, которая позволяет вам передать список строк, которые вы хотите заменить? Например, gsub(c(".*_scott80_.*", ".*_harry11_.*"), "incongruent", d) не подойдет.


person Geek On Acid    schedule 07.11.2012    source источник


Ответы (2)


Вот один из способов

> gsub(".*_scott80_.*", "incongruent", d)
[1] "incongruent"           "harry11_norm.avi"      "incongruent"          
[4] "joel51_lpf.avi"        "rich82_joel51_lpf.avi"

Или с grep

> d[grep("_scott80_", d)] <- "incongruent"
> d
[1] "incongruent"           "harry11_norm.avi"      "incongruent"          
[4] "joel51_lpf.avi"        "rich82_joel51_lpf.avi"

Чтобы исправить ваше редактирование, я считаю, что это будет сделано (используя | для обозначения «или»)

gsub(".*(_scott80_|_harry11_).*", "incongruent", d)

Конечно, у вас нет строк в d, соответствующих "_harry11_".

person GSee    schedule 07.11.2012
comment
Вау, это было ОЧЕНЬ быстро, спасибо @GSee. Тот, который использует gsub, лучше подходит для моей цели, потому что позволяет мне создать отдельный столбец с новыми выражениями. - person Geek On Acid; 07.11.2012

Если ваши имена файлов имеют одинаковый формат, т. е. файлы с двумя именами, т. е. harry11_scott80_norm.avi всегда, имеют два символа подчеркивания, а файлы с одним именем, т. е. harry11_norm.avi всегда, имеют один символ подчеркивания, можно быстро использовать что-то вроде этого, чтобы переименовать ваши файлы:

d = gsub(".*_.*_.*", "incongruent", d)
> d
[1] "incongruent"      "harry11_norm.avi" "incongruent"      "joel51_lpf.avi"  
[5] "incongruent"

d =gsub(".*_.*","congruent",d)
> d
[1] "incongruent" "congruent"   "incongruent" "congruent"   "incongruent"
person AGS    schedule 07.11.2012