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
- 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 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))
---------------------
原文:https://blog.csdn.net/u013421629/article/details/78893469