Мы можем использовать grepl
здесь для базовой опции R:
a$has_special_char <- grepl("(?![-./&,])[[:punct:]]", a$name, perl=TRUE)
a$special_char <- ifelse(a$has_special_char, sub("^.*([[:punct:]]).*$", "\\1", a$name), NA)
a
name has_special_char special_char
1 foo FALSE <NA>
2 bar' TRUE '
3 ip_sum TRUE _
4 four FALSE <NA>
5 %23 TRUE %
6 2_planet! TRUE !
7 @abc!! TRUE !
Данные:
a <- data.frame(name=c("foo","bar'","ip_sum","four","%23","2_planet!","@abc!!"))
Приведенные выше логики c возвращают, произвольно, первый символ символа, если присутствует, в каждом имени, в противном случае возвращается NA
. Он повторно использует столбец has_special_char
, чтобы определить, встречается ли уже символ в имени.
Редактировать:
Если вы хотите столбец, который показывает все специальных символов, затем используйте:
a$all_special_char <- ifelse(a$has_special_char, gsub("[^[:punct:]]+", "", a$name), NA)