Notes-stringr-part1

1、字符串拆分利器–str_split

2、字符串替换利器–str_replace_all

3、字符串抽取利器–str_match_all

4、字符串截取利器–str_sub

字符串处理中最为常见的四种手段有“拆、替、抽、取”。强烈推荐stringr包,个人觉得远比R自带的grep、regexp、strsplit、sub等函数好用。

利器1:拆:str_split

  1. str_split(string, pattern, n = Inf, simplify = FALSE)
  2. string:指定需要处理的字符串向量
  3. pattern:分隔符,可以是复杂的正则表达式
  4. n:指定切割的份数,默认所有符合条件的字符串都会被拆分开来
  5. 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 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

  1. str_replace(string, pattern, replacement)
  2. str_replace_all(string, pattern, replacement)
  3. string:字符串向量
  4. pattern:被替换的子字符串,可以是复杂的正则表达式
  5. 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))

--------------------- 

原文:https://blog.csdn.net/u013421629/article/details/78893469

posted @ 2018-12-26 13:46  Zoe-D  阅读(220)  评论(0编辑  收藏  举报