stringr包中主要内容:
字符串处理中最为常见的四种手段有“拆、替、抽、取”。强烈推荐stringr包,个人觉得远比R自带的grep、regexp、strsplit、sub等函数好用。
利器1:拆:str_split
str_split(string, pattern, n = Inf, simplify = FALSE)
string:指定需要处理的字符串向量
pattern:分隔符,可以是复杂的正则表达式
n:指定切割的份数,默认所有符合条件的字符串都会被拆分开来
simplify:是否返回字符串矩阵,默认以列表的形式返回
> str_split(c('[email protected]','0511-87208801'), '[@-]')
[[1]]
[1] "lsxxx2011" "163.com"
[[2]]
[1] "0511" "87208801"
>
#例如数据表中有一列邮箱字段,如何把地址和域名两部分拆分开来存储到新的两列中?
email <- c('[email protected]','[email protected]','[email protected]','[email protected]')
# 结合sapply函数获得@分隔符前面和后面的内容
add <- sapply(str_split(email,'@'),'[',1)
doman <- sapply(str_split(email,'@'),'[',2)
df <- data.frame(email, add, doman)
df
> df
email add doman
1 lsxxx2011@163.com lsxxx2011 163.com
2 1029776077@qq.com 1029776077 qq.com
3 qazwsx@gmail.com qazwsx gmail.com
4 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, '%', ''))/100
commadatanew
percentdatanew
利器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))