【R语言 字符串处理】stringr 包的强大之处

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:是否返回字符串矩阵,默认以列表的形式返回
  • 1
  • 2
  • 3
  • 4
  • 5
> str_split(c('[email protected]','0511-87208801'), '[@-]')
[[1]]
[1] "lsxxx2011" "163.com"  

[[2]]
[1] "0511"     "87208801"

> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
#例如数据表中有一列邮箱字段,如何把地址和域名两部分拆分开来存储到新的两列中?
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
> 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
> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

利器2:替:str_replace与str_replace_all

str_replace(string, pattern, replacement)
str_replace_all(string, pattern, replacement)
string:字符串向量
pattern:被替换的子字符串,可以是复杂的正则表达式
replacement:用来替换的字符串
  • 1
  • 2
  • 3
  • 4
  • 5

两个函数的区别在于,前面函数只替换首次满足条件的子字符串,后面的函数可以替换所有满足条件的子字符串。

#例子
#将含有千分位符或百分位符的数据转换为数值型数据
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

利器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。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
例子:
# 抽取出字符串中的日期和流量值
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

利器4:取:str_sub

str_sub(string, start = 1L, end = -1L)
string:字符串向量
start:指定获取子字符串的起始位置
end:指定获取子字符串的终止位置
注意:如果start或end为负整数时,则从字符串的最后一个字符向前查询
  • 1
  • 2
  • 3
  • 4
  • 5
#例子
# 获取手机号的末尾4位(负整数参数)
s <- c('13611235678','13912343344','17888886666')
(tail4 <- str_sub(s, -4))

猜你喜欢

转载自blog.csdn.net/kwame211/article/details/80623935