【R语言 字符串处理】stringr 包的强大之处
来源:互联网 发布:mac os 10.13iso镜像 编辑:程序博客网 时间:2024/05/18 19:22
stringr包中主要内容:
- 1、字符串拆分利器–str_split
- 2、字符串替换利器–str_replace_all
- 3、字符串抽取利器–str_match_all
- 4、字符串截取利器–str_sub
字符串处理中最为常见的四种手段有“拆、替、抽、取”。强烈推荐stringr包,个人觉得远比R自带的grep、regexp、strsplit、sub等函数好用。
利器1:拆:str_split
str_split(string, pattern, n = Inf, simplify = FALSE)string:指定需要处理的字符串向量pattern:分隔符,可以是复杂的正则表达式n:指定切割的份数,默认所有符合条件的字符串都会被拆分开来simplify:是否返回字符串矩阵,默认以列表的形式返回
> str_split(c('lsxxx2011@163.com','0511-87208801'), '[@-]')[[1]][1] "lsxxx2011" "163.com" [[2]][1] "0511" "87208801">
#例如数据表中有一列邮箱字段,如何把地址和域名两部分拆分开来存储到新的两列中?email <- c('lsxxx2011@163.com','1029776077@qq.com','qazwsx@gmail.com','abc123edc@126.com')# 结合sapply函数获得@分隔符前面和后面的内容add <- sapply(str_split(email,'@'),'[',1)doman <- sapply(str_split(email,'@'),'[',2)df <- data.frame(email, add, doman)df
> df email add doman1 lsxxx2011@163.com lsxxx2011 163.com2 1029776077@qq.com 1029776077 qq.com3 qazwsx@gmail.com qazwsx gmail.com4 abc123edc@126.com abc123edc 126.com>
利器2:替:str_replace与str_replace_all
str_replace(string, pattern, replacement)str_replace_all(string, pattern, replacement)string:字符串向量pattern:被替换的子字符串,可以是复杂的正则表达式replacement:用来替换的字符串
两个函数的区别在于,前面函数只替换首次满足条件的子字符串,后面的函数可以替换所有满足条件的子字符串。
#例子#将含有千分位符或百分位符的数据转换为数值型数据commadata <- c('123,456','780,123,433','45,234')percentdata <- c('23.4%','34.56','44.12%')commadatanew <- as.numeric(str_replace_all(commadata, ',', ''))percentdatanew <- as.numeric(str_replace_all(percentdata, '%', ''))/100commadatanewpercentdatanew
利器3:抽:str_extract和str_extract_all和str_match_all。
str_extract(string, pattern)str_extract_all(string, pattern, simplify = FALSE)string:字符串向量pattern:抽取出满足条件的子字符串,往往使用正则表达式simplify:是否返回字符串矩阵,默认以列表的形式返回两个函数的区别在于,前面函数只抽取出首次满足条件的子字符串,后面的函数可以抽取出所有满足条件的子字符串。当前面的函数没有匹配到抽取的结果,则返回NA,而后面的函数在没有匹配到抽取的结果时返回character(0)。str_match(string, pattern)str_match_all(string, pattern)函数参数的含义同str_extract。
例子:# 抽取出字符串中的日期和流量值s <- c('date:2017-04-14,pv:223453','date:2017-04-15,pv:228115','date:2017-04-16,pv:201233','date:2017-04-17,pv:324123')date <- str_extract_all(s, '[0-9]{4}-[0-9]{2}-[0-9]{2}')pv <- str_extract_all(s, 'pv:([0-9]*)')unlist(date)unlist(pv)#结果中的pv两竟然还是包含'pv:'字符串,下面我们用另一个抽函数str_match_all。pv <- str_match_all(s, 'pv:([0-9]*)')pv <- sapply(pv,'[',2)pv
利器4:取:str_sub
str_sub(string, start = 1L, end = -1L)string:字符串向量start:指定获取子字符串的起始位置end:指定获取子字符串的终止位置注意:如果start或end为负整数时,则从字符串的最后一个字符向前查询
#例子# 获取手机号的末尾4位(负整数参数)s <- c('13611235678','13912343344','17888886666')(tail4 <- str_sub(s, -4))
阅读全文