Я пытаюсь извлечь часть столбца в фрейме данных, используя регулярные выражения. Проблемы, с которыми я столкнулся, включают факты, которые grep
возвращает целое значение, а не только совпадающую часть, и что str_extract
, похоже, не работает в векторном виде.Замените столбец фрейма данных на основе regex
Вот что я пытаюсь. Я хотел бы df$match
показать alpha.alpha.
, где шаблон существует и NA
в противном случае. Как показать только совпадающую часть?
Кроме того, как я могу заменить [a-zA-Z]
в R regex? Могу ли я использовать класс символов или код POSIX, например [:alpha:]
?
v1 <- c(1:4)
v2 <- c("_a.b._", NA, "_C.D._", "_ef_")
df <- data.frame(v1, v2, stringsAsFactors = FALSE)
df$match <- grepl("[a-zA-Z]\\.[a-zA-Z]\\.", df$v2)
df$match
#TRUE FALSE TRUE FALSE
v2grep <- grep("[a-zA-Z]\\.[a-zA-Z]\\.", df$v2, value = TRUE)
df$match[df$match == TRUE] <- v2grep
df$match[df$match == FALSE] <- NA
df
#v1 v2 match
#1 _a.b._ _a.b._
#2 <NA> <NA>
#3 _C.D._ _C.D._
#4 _ef_ <NA>
Что я хочу:
#v1 v2 match
#1 _a.b._ a.b.
#2 <NA> <NA>
#3 _C.D._ C.D.
#4 _ef_ <NA>
Мне нравится 'strringi' решение. Это действительно богатый пакет, с ним можно многое сделать, когда у него есть время, чтобы изучить его! –
Кажется, что 'stringi' делает то, что мне нужно. Будет ли это также позволять мне выделять части шаблона, как вы делаете с 'gsub (pat," \\ 2 ", df [[" v2 "]])' во втором решении? –
Да, но вам нужен другой шаблон и, возможно, функция в зависимости от того, что вам нужно. –