如何在str_count中正确使用[:graph:]等正则辅助类统计唯一字符
问题解决方法
错误原因
你遇到的问题本质是str_count的用法和POSIX字符类的书写规则问题:
- 原代码中
str_count(x, "[:graph:]")会返回整个字符串里所有符合规则的字符的总出现次数,你对这个总次数判断>0,只会得到1个逻辑值,求和后自然恒为1(只要字符串存在符合规则的字符),无法统计唯一字符数量 - POSIX字符类在正则表达式中使用时,需要包裹在额外的方括号内,正确写法为
[[:graph:]],否则可能出现匹配异常
[[:graph:]]匹配所有可打印的非空白字符,包含字母、数字、标点符号,刚好符合你需要的匹配规则,空格等空白字符会被自动排除,和你原来手动指定letters, 0:9, "-"的匹配逻辑完全一致。
解决代码
library(tidyverse) test <- data.frame(oe = c("A-1", "111", "-", "Sie befassen sich intensiv damit")) test %>% mutate(unique_chars_correct = sapply(tolower(oe), function(x) sum(str_count(x, c(letters, 0:9, "-")) > 0)), # 基于[:graph:]的正确统计逻辑 unique_chars_graph = sapply(tolower(oe), function(x) { # 拆分字符串为单个字符 single_chars <- strsplit(x, split = "")[[1]] # 筛选符合[:graph:]规则的字符,去重后计数 length(unique(single_chars[str_detect(single_chars, "[[:graph:]]")])) }))
输出结果
oe unique_chars_correct unique_chars_graph 1 A-1 3 3 2 111 1 1 3 - 1 1 4 Sie befassen sich intensiv damit 13 13
内容的提问来源于stack exchange,提问作者deschen
相关产品推荐
相关产品推荐

