Замена и несоответствия с 'sub' - PullRequest
0 голосов
/ 10 марта 2012

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

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

Этот оператор создал новый столбец идентификатора, найдя строки, в которых идентификатор был встроен в столбце описания.Оператор sub найдет номер, следующий за «CIR0», и заполнит столбец id, если в описании строки будет идентификатор.Я признаю, что это неэффективно со встроенным поднабором grep по обе стороны от назначения.

Есть ли способ сделать замену 'sub' 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 ]

1 голос
/ 10 марта 2012

Я боролся с той же проблемой несколько недель назад. В итоге я использовал функцию 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 
0 голосов
/ 10 марта 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...