R: показать соответствующий специальный символ в строке - PullRequest
1 голос
/ 22 апреля 2020

Как я могу показать, какой специальный символ совпадал в каждой строке отдельного столбца данных?

Пример кадра данных:

a <- data.frame(name=c("foo","bar'","ip_sum","four","%23","2_planet!","@abc!!"))

определение, имеет ли строка специальный символ:

a$name_cleansed <- gsub("([-./&,])|[[:punct:]]","\\1",a$name) #\\1 puts back the exception we define (dash and slash)

a <- a %>% mutate(has_special_char=if_else(name==name_cleansed,FALSE,TRUE))

enter image description here

Ответы [ 3 ]

1 голос
/ 22 апреля 2020

Мы можем использовать 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)
1 голос
/ 22 апреля 2020

Вы можете использовать str_extract, если нам нужен только первый специальный символ.

library(stringr)
str_extract(a$name,'[[:punct:]]')
#[1] NA  "'" "_" NA  "%" "_" "@"

Если нам нужны все специальные символы, мы можем использовать str_extract_all.

sapply(str_extract_all(a$name,'[[:punct:]]'), function(x) toString(unique(x)))
#[1] ""     "'"    "_"    ""     "%"    "_, !" "@, !"

Чтобы исключить определенные символы, мы можем использовать

exclude_symbol <- c('-', '.', '/', '&', ',')

sapply(str_extract_all(a$name,'[[:punct:]]'), function(x) 
                       toString(setdiff(unique(x), exclude_symbol)))
0 голосов
/ 22 апреля 2020

Решение регулярного выражения Base R с использованием (каретки), а не оператора «^»:

gsub("(^[-./&,])|[^[:punct:]]", "", a$name)

Также, если вы хотите, чтобы возвращался data.frame:

within(a, {
  special_char <- gsub("(^[-./&,])|[^[:punct:]]", "", name); 
  has_special_char <- special_char != ""})

Если вы хотите только уникальный специальные символы на имя, как в ответе @Ronak Shah:

within(a, {
    special_char <- sapply(gsub("(^[-./&,])|[^[:punct:]]", "", a$name),
                           function(x){toString(unique(unlist(strsplit(x, ""))))});
    has_special_char <- special_char != ""
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...