1 Star 7 Fork 1

zhongyf / Rbook

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
03-strings.Rmd 17.40 KB
一键复制 编辑 原始数据 按行查看 历史
zhongyf 提交于 2021-06-21 18:30 . commit
# 字符处理 {#character:handling} 实际数据分析工作中,经常需要处理字符串以便让数据整洁,符合分析需求。在我们常用工具 Excel 或 SQL 中也有处理字符串的需求。绝大部分时候,截断、替换等基础实现就能满足我们的大部分字符处理需求。 Excel 中自带的字符串函数[^text],如:`left`,`len`,`mid`,`find`,`Proper`,`rept`,`trim`,`upper`,`substitute`, `concatenate`,以及`Excle`2019新出的`concat`,`TEXTJOIN`等字符函数,`TEXTJOIN`函数我个人比较喜欢用。 但是Excel中字符处理功能存在一定局限性,没有直接可用的正则表达式[^Regularexpression]函数,在正则表达式本身就很困难的情况下,在VBA中实现较复杂的函数将会难上加难。 > 在学习 R 的字符处理时候,可以自行尝试实现以上相对应 Excel 函数 字符处理,本人觉得本质上就是将字符定位后去实现不同的操作,比如替换、截断等。所以字符处理难点在于字符串中字符的定位,而实现这个功能就需要用到正则表达式,所以字符处理真正的难点在于正则表达式的编写。但是,在我看来正则表达式想要掌握,难度过高,我们秉着随用随查的态度对待即可。 因为大部分的数据分析工作者并不会面临太多复杂的字符处理工作,对大部分常规商业数据分析工作者面对的数据而言,字符处理可能仅仅只是合并、剔除、删除空格、倒序等基础操作。面对舆情监控,购物评价等纯文本情感分析工作,个人觉得对普通数据分析岗位有点超纲,所以本章节的字符处理仅仅是常规的字符处理。 [^text]:Excel中支持的[TEXT functions](https://support.microsoft.com/zh-cn/office/%e6%96%87%e6%9c%ac%e5%87%bd%e6%95%b0%ef%bc%88%e5%8f%82%e8%80%83%ef%bc%89-cccd86ad-547d-4ea9-a065-7bb697c2a56e?ui=zh-CN&rs=zh-CN&ad=CN) [^Regularexpression]:正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),查看帮助`?regex`。 在 R 语言中字符处理,可以分为两大方法,一种是 base R 中原生的字符处理函数,另外一种是使用 tidyverse 系列中的 stringr 处理字符。所以本章节着重从这两方面阐述字符处理函数用法。 ## base R {#character:base-R} 本小节简述 base R 中关于字符处理的常用函数。 ### 单双引号 `R`语言中字符串输入时,可以使用单引号,也可以使用双引号,详情请看`?Quotes`。 - 单双引号,用法和意义没有差别 - R 中推荐使用双引号分隔符,打印、显示时都是用双引号 - 单引号字符串通常用在字符串内包含双引号时,如用 R 执行 sql 字符串代码时 - R-4.0之后引入的R字符[newfeatures],让单双引号基本没区别 R中的字符用单双引号都可创建,如下所示: ```{r} x 错误: unexpected string constant in "paste(""","" ``` R语言中使用"\"把特定的字符转义为特殊字符,例如“\t”是制表符,“\n”是换行符,或者是“\r\n”(系统差异)。想要正确显示"'",需使用转义,如下所示: ```{r} char 大家可以自行了解`paste`和`paste0`两个函数的差异。 - 截取 `substr`函数用于字符串截取子字符串,start,stop参数是整数。 ```{r } # 空格占据一个长度 substr("R is free software" ,start = 1,stop = 6) ``` - 分割 函数`strsplit`按照指定的字符把字符分割成子字符。参数x指被分割的字符,split是用于分割的字符标准,fixed是否完全匹配分隔符,默认是TRUE,完全匹配模式,当fixed参数为FALSE时,表明split参数是正则表达式,使用正则匹配。 ```{r eval=FALSE} strsplit(x,split,fixed,perl,useBytes) ``` strsplit函数返回的结果是列表,大部分时候需要向量化后使用。 ```{r} strsplit('广东省-深圳市-宝安区',split='-') # 向量化 # unlist(strsplit('广东省-深圳市-宝安区',split='-')) ``` 官方手册中提供一个字符倒叙的自定义编写的函数: ```{r} strReverse strings % unlist() # same above #str_split('ab||cd','\\|\\|') %>% purrr::as_vector() ``` 当待处理的字符串是字符串向量时,得到的列表长度与向量长度一致 ```{r} fruits % unlist() #str_split 拆解出来是列表 需要向量化 } dt[,list(newcol=my_str_split(letters)),by=.(col)] ``` ## base 和 stringr{#character:the-difference-stringr-and-base} 以下表格数据对比,主要是 base R 和 stringr 中相应字符处理功能函数对比。 表格数据来源[stringr and base differences](https://stringr.tidyverse.org/articles/from-base.html)。表格数据可用以下代码获取(注意网络): ```{r eval=FALSE} library(tidyverse) library(rvest) dt % html_table() %>% `[[`(1) ``` | base | stringr | | ---------------------------------- | ---------------------------------------- | | gregexpr(pattern, x) | str_locate_all(x, pattern) | | grep(pattern, x, value = TRUE) | str_subset(x, pattern) | | grep(pattern, x) | str_which(x, pattern) | | grepl(pattern, x) | str_detect(x, pattern) | | gsub(pattern, replacement, x) | str_replace_all(x, pattern, replacement) | | nchar(x) | str_length(x) | | order(x) | str_order(x) | | regexec(pattern, x) + regmatches() | str_match(x, pattern) | | regexpr(pattern, x) + regmatches() | str_extract(x, pattern) | | regexpr(pattern, x) | str_locate(x, pattern) | | sort(x) | str_sort(x) | | strrep(x, n) | str_dup(x, n) | | strsplit(x, pattern) | str_split(x, pattern) | | strwrap(x) | str_wrap(x) | | sub(pattern, replacement, x) | str_replace(x, pattern, replacement) | | substr(x, start, end) | str_sub(x, start, end) | | tolower(x) | str_to_lower(x) | | tools::toTitleCase(x) | str_to_title(x) | | toupper(x) | str_to_upper(x) | | trimws(x) | str_trim(x) | 通过以上对比,方便我们从 Base R 切换到 stringr 包的使用。 ## 参考资料 {#character:reference-material} 1. tidyverse-stringr: 2. stringr vignettes: 3. R new feature: 4. R-4.0.0 NEW features:
R
1
https://gitee.com/zhongyufei/Rbook.git
git@gitee.com:zhongyufei/Rbook.git
zhongyufei
Rbook
Rbook
master

搜索帮助