stringr包字符串处理笔记1
字符串处理中最为常见的四种手段有“拆、替、抽、取”,stringr包有众多处理字符串的函数,一般都是以str_开头命名,便于记忆。
1、字符串连接str_c
- 关于字符串的连接我习惯用paste()
- stringr包中也有类似的函数
str_c
- 两个函数基本一样,都有
sep
(多变多)collapse
(多变一)设置 - 不同点,关于
NA
的处理和sep
默认设置(有无空格)
> str_c("a", "b", str_replace_na(NA))
[1] "abNA"
> str_c("a", "b", NA)
[1] NA
> paste("a","b",NA,sep="")
[1] "abNA"
2、拆:str_split
- 根据数值中
,
空格
-
/
%
等字符,拆分为两个向量 - 联想到
tidyr
包中的separate
str_split(string, pattern, n = Inf, simplify = FALSE)
string:指定需要处理的字符串向量
pattern:分隔符,可以是复杂的正则表达式
n:指定切割的份数,默认所有符合条件的字符串都会被拆分开来
simplify:是否返回字符串矩阵,默认以列表的形式返回
- 举例
> email <- c('[email protected]','[email protected]',
'[email protected]','[email protected]')
> # 结合sapply函数获得@分隔符前面和后面的内容
> str_split(email,"@")
[[1]]
[1] "lsxxx2011" "163.com"
[[2]]
[1] "1029776077" "qq.com"
> add <- sapply(str_split(email,'@'),'[',1)
> doman <- sapply(str_split(email,'@'),'[',2)
> df <- data.frame(email, add, doman)
> 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
separate
separate(data, col, into, sep (= 正则表达式), remove =TRUE,convert = FALSE, extra = "warn", fill = "warn", ...)
第一个参数放要分离的数据框;
第二个参数放要分离的列;
第三个参数是分割成的变量的列(肯定是多个),用向量表示;
第四个参数是分隔符,用正则表达式表示,或者写数字,表示从第几位分开
- 注意:对象是数据框
> separate(email,name,into = c("a","b"),sep = "\\.")
a b
1 lsxxx2011@163 com
2 1029776077@qq com
> separate(email,name,into = c("a","b"),sep = "@")
a b
1 lsxxx2011 163.com
2 1029776077 qq.com
> separate(email,name,into = c("a","b","c"),sep = "([\\.@])")
a b c
1 lsxxx2011 163 com
2 1029776077 qq com
3、 替: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%')
> > str_replace_all(commadata, ',', '')
[1] "123456" "780123433" "45234"
> str_replace_all(percentdata, '%', '')
[1] "23.4" "34.56" "44.12"
> commadatanew <- as.numeric(str_replace_all(commadata, ',', ''))
> percentdatanew <- as.numeric(str_replace_all(percentdata, '%', ''))/100
> commadatanew
[1] 123456 780123433 45234
> percentdatanew
[1] 0.2340 0.3456 0.4412
4、抽:str_extract、str_extract_all、str_match_all
- 需要正则表达式,提取
str_extract(string, pattern)
str_extract_all(string, pattern, simplify = FALSE)
string:字符串向量;
pattern:抽取出满足条件的子字符串,往往使用正则表达式;
simplify:是否返回字符串矩阵,默认以列表的形式返回,
all:两个函数的区别在于,前面函数只抽取出首次满足条件的子字符串,
后面的函数可以抽取出所有满足条件的子字符串。
当前面的函数没有匹配到抽取的结果,则返回NA,而后面的函数在没有匹配到
抽取的结果时返回character(0)。
- 举例
# 抽取出字符串中的日期和流量值
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}')
> unlist(date)
[1] "2017-04-14" "2017-04-15" "2017-04-16" "2017-04-17"
> pv <- str_extract_all(s, 'pv:([0-9]*)')
> unlist(pv)
[1] "pv:223453" "pv:228115" "pv:201233" "pv:324123"
> pv <- str_extract_all(s, 'pv:([0-9]*)',simplify = T)
> pv
[,1]
[1,] "pv:223453"
[2,] "pv:228115"
[3,] "pv:201233"
[4,] "pv:324123"
5、取:str_sub
- 类似excel中的
left,right
提取数值。
str_sub(string, start = 1L, end = -1L)
string:字符串向量
start:指定获取子字符串的起始位置
end:指定获取子字符串的终止位置
注意:如果start或end为负整数时,则从字符串的最后一个字符向前查询
- 举例
> str_sub(s,1,15)
[1] "date:2017-04-14" "date:2017-04-15" "date:2017-04-16" "date:2017-04-17"
> str_sub(s,17,30)
[1] "pv:223453" "pv:228115" "pv:201233" "pv:324123"