Замена и не-совпадения с 'sub'

Несколько месяцев назад я закончил с подзаголовком, который первоначально работал с моими входными данными. С тех пор он прекратил работу, заставив меня пересмотреть мой уродливый процесс. Ненавижу делиться ею, но это сразу привело к нескольким вещам:

active$id[grep("CIR",active$description)] <- sub(".*CIR0*(\\d+).*","\\1",active$description[grep("CIR",active$description)],perl=TRUE)

Этот оператор создал новый столбец идентификаторов, найдя строки с идентификатором, встроенным в столбец описания. Подзаголовок найдет число, следующее за "CIR0", и заполнит столбец id, если в описании строки есть идентификатор. Я признаю, что он неэффективен для встроенного grep-подмножества с обеих сторон назначения.

Есть ли способ заменить "под" заменой NA или пустым, если шаблон не соответствует? Я чувствую, что мне не хватает чего-то очень простого, но прошу об оказании помощи в сообществе. Спасибо.

Пример с результатами создания столбца id:

| name | id | description |
|------+-----+-------------------|
| a | 343 | Here is CIR00343 |
| b | | Didn't have it |
| c | 123 | What is CIR0123 |
| d | | CIR lacks a digit |
| e | 452 | CIR452 is next |
2 ответа

Несколько недель назад я боролся с тем же вопросом. Я закончил использование функции str_match из пакета stringr. Он возвращает NA, если целевая строка не найдена. Просто убедитесь, что вы подмножите результат правильно. Пример:

library(stringr)
str = "Little_Red_Riding_Hood"
sub(".*(Little).*","\\1",str) # Returns 'Little'
sub(".*(Big).*","\\1",str) # Returns 'Little_Red_Riding_Hood'
str_match(str,".*(Little).*")[1,2] #Returns 'Little'
str_match(str,".*(Big).*")[1,2] # Returns NA


Я думаю, в этом случае вы можете попробовать использовать ifelse(), т. ifelse()

active$id[grep("CIR",active$description)] <- ifelse(match, replacement, "")

где match должно соответствовать true, если есть совпадение, а replacement - это то, что в этом случае этот элемент будет заменен. Аналогично, если match соответствует false, этот элемент заменяется пустой строкой (или NA если вы предпочитаете).

licensed under cc by-sa 3.0 with attribution.