stringr字符处理 - 简书 (jianshu.com)
dplyr表格操作 - 简书 (jianshu.com)
在正式学习
stringr
、dplyr
为代表的tidyrverse
核心系列包时,有必要先了解下正则表达式以及管道符的相关知识。
正则表达式
-
.
: 可以匹配除换行符外的任意字符 -
?
:表示前面的模式(无特殊情况即单个字符)重复0 次或 1 次。
+
:1 次或多次。
*
:0 次或多次。
{n}
:指定匹配 n 次。
{n,}
:指定匹配 n 次或更多次。
{,m}
:指定最多匹配 m 次。
{n, m}
:指定匹配 n 到 m 次 -
^
从字符串开头进行匹配
$
从字符串末尾进行匹配。 -
\d
:匹配数字
\s
:可以匹配任意空白符
\b
:匹配单词间的边界
创建包含
\
(例如\d
、\s
...)的正则表达式,需要在字符串中对\
进行转移,即\\d
、\\s
。其实只要记住\\
本质上代表\
即可。
如果只是想匹配字符串本身的含义,fixed(正则表达式)
可将正则表达式相关字符当作纯文本字符看待。
[abc]
:可以匹配a、b,或c
[^abc]
:可以匹配除a、b,c外的任意字符
[a-z]
: 匹配任意小写字母;[A-Z]
:任意大写字母;[A-z]
:任意字母
|
表示或,常搭配小括号,例如gr(e|a)y
表示匹配grey或者gray[:digit:]
:匹配数字
[:alpha:]
:匹配字母
[:lower:]
:匹配小写字母
[:upper:]
:匹配大写字母
[:alnum:]
:匹配字母/数字
[:punct:]
:匹配标点符号
[:blank:]
:匹配空格、tab
[:space:]
:匹配空格、tab、换行符最后的话,
()
小括号可以用于表示分组,\1
表示回溯引用第一个分组,具体用法可参考下面的str_match()
函数的介绍。
fruit = c("apple","banana","pear","pineapple")
#查找具有ABAB模式的字符串
str_view(fruit,"(.)(.)\\1\\2", match = T)
注意:默认的正则匹配方式都是“贪婪的”,即正则表达式会在符合规则的前提下匹配尽量长的字符串。通过在正则表达式后面添加一个
?
,你可以将匹配方式更改为“懒惰的”,即匹配尽量短的字符串。
管道符%>%
- magrittr包提供的管道符语法对于R语言的代码处理过程大大提高了效率,可通过下述方式查看内置官方文档;
?magrittr::`%>%
- 在加载
dplyr
包时会自动加载magrittr
包,从而便捷的使用管道符操作; -
管道符的含义理解,如下图所示;
- 相关笔记可参考 https://zhuanlan.zhihu.com/p/29845549
stringr字符处理
1、字符串向量特征匹配
2、字符串特征匹配(取子集)
3、字符串的替换修改
4、字符串格式相关
5、字符串拼接与拆分
library(stringr)
https://github.com/rstudio/cheatsheets/blob/master/strings.pdf
1、字符串向量特征匹配
对于一个字符串向量,判断其中哪些字符串是否具有给定的模式特征
- 1.1
str_detect()
:判断每个字符串是否具有匹配模式,返回等长的逻辑值向量
fruit <- c("apple", "banana", "pear", "pinapple")
str_detect(fruit, "a") #包含a的字符串
str_detect(fruit, "a", negate = T) #不包含a的字符串
str_detect(fruit, "^a") #以a开头的字符串
str_detect(fruit, "[aeiou]") #含有aeiou其中任意一个字符的字符串
- 1.2
str_starts()
/str_ends()
:判断每个字符串的开头/结尾是否具有匹配模式,同样返回等长的逻辑值向量
fruit <- c("apple", "banana", "pear", "pinapple")
str_starts(fruit, "p")
str_ends(fruit, "e")
- 1.3
str_which()
/str_subset()
:判断向量里的哪个字符串具有匹配模式;前者返回数字序号,后者返回具体的字符串
# str_which == which(str_detect(x, pattern))
# str_detect == x[str_detect(x, pattern)]
fruit <- c("apple", "banana", "pear", "pinapple")
str_subset(fruit, "a")
str_which(fruit, "a")
- 1.4
str_locate()
: 返回匹配的模式在字符串的起始位置
fruit <- c("apple", "banana", "pear", "pineapple")
str_locate(fruit, "a")
str_locate_all(fruit, "a")
- 1.5
str_count()
:返回每个字符串内有多少个符合匹配模式组成
fruit <- c("apple", "banana", "pear", "pineapple")
str_count(fruit, "a")
str_count(fruit, c("a", "b", "p", "p")) #向量化操作
2、字符串特征匹配(取子集)
- 2.1
str_sub()
:指定字符串的起始位置提取
hw <- "Hadley Wickham"
str_sub(hw, 1, 6)
str_sub(hw, -3, -1)
- 2.2
str_extract()
: 提取字符串里的特征模式
shopping_list <- c("apples x4", "bag of flour", "bag of sugar", "milk x2")
str_extract(shopping_list, "\\d") #提取数字
str_extract(shopping_list, "[a-z]+") #提取1至多个小写字母
str_extract(shopping_list, "[a-z]{1,4}") #贪婪匹配
str_extract(shopping_list, "[a-z]{1,4}?") #懒惰匹配
str_extract(shopping_list, "\\b[a-z]{1,4}\\b") #提取特征模式的单词
str_extract(shopping_list, fixed("\\b[a-z]{1,4}\\b")) #fixed可将正则表达式视为普通字符串
#str_extract 默认只提取字符串里第一个符合的模式
#str_extract_all可以提取全部的匹配
str_extract_all(shopping_list, "[a-z]+")
str_extract_all(shopping_list, "\\b[a-z]+\\b")
- 2.3
str_match()
: 可分组提取字符串里的特征模式,更加灵活。
搭配括号使用,可提取分组的内容。该函数返回一个矩阵:第一列是完整匹配,第二列及以后是每个分组(括号)的匹配。适用于启发式的匹配提取,例如前缀、后缀等
str_match("bacad","b(a)") #提取前一个字符为b的a
str_match("bacad","[^b](a)") ##提取前一个字符不为b的a
#回溯引用
str_match("banana","(a)(.)(\\1\\2)") #提取aXaX的模式文本,其中X可以是任何文本
3、字符串的替换修改
str_replace()
?str_replace #默认只替换第一个模式的文本
?str_replace_all #全部
fruits = c("apple","banana","pear")
str_replace(fruits, "[aeiou]", "-")
#回溯应用,下面表示将a替换为aa,e替换为ee
str_replace(fruits, "([aeiou])", "\\1\\1")
#向量化一对一替换
str_replace(fruits, "[aeiou]", c("1", "2", "3"))
str_replace_all(fruits, "[aeiou]", c("1", "2", "3"))
str_replace(fruits, c("p", "e", "a"), "-")
str_replace_all(fruits, c("p", "e", "a"), "-")
# 多种特定模式的替换,仅限于str_replace_all
fruits %>%
str_c(collapse = "---") %>%
str_replace_all(c("one" = "1", "two" = "2", "three" = "3"))
4、字符串格式相关
- 4.1
str_length()
:返回每个字符串的长度
str_length(c("i", "like", "programming", NA))
- 4.2
str_pad()
:将字符串填补至指定长度,默认用空格填充
rbind(
str_pad("hadley", 30, "left"),
str_pad("hadley", 30, "right"),
str_pad("hadley", 30, "both")
)
str_pad("a", 10, pad = c("-", "_", " "))
- 4.3
str_trunc()
:限制字符串的长度,用省略号代替
x <- "This string is moderately long"
rbind(
str_trunc(x, 20, "right"),
str_trunc(x, 20, "left"),
str_trunc(x, 20, "center")
)
- 4.4
str_trim()
:去除字符串两边的空格(包括tab、换行符);
str_squish()
:去除字符串两边的空格(tab、换行符),以及替换所有两个以上的空格为一个空格
str_trim(" String with trailing and leading white space\t")
str_trim("\n\nString with trailing and leading white space\n\n")
str_squish(" String with trailing, middle, and leading white space\t")
- 4.5
str_wrap()
:将太长的英语句子限制为每行仅包含指定长度字符的若干行文本(本质上即为自动插入换行符);首要前提需要为包含空格的字符串
sentences[1]
cat(str_wrap(sentences[1],width = 10))
- 4.6
str_glue()
:使用占位符格式化输出,类似于sprintf()
name <- "Fred"
age <- 50
str_glue("My name is {name}, my age next year is {age + 1}")
mtcars[1:3,] %>% str_glue_data("{rownames(.)} has {hp} hp")
- 4.7 大小写转换
dog <- "The quick brown dog"
##变大写
str_to_upper(dog)
##变小写
str_to_lower(dog)
##首字母大写
str_to_title(dog)
5、字符串拼接与拆分
-
str_c()
:拼接两个字符串,默认连接符为空白
str_c("Letter-", letters)
str_c("Letter", letters, sep = ": ")
str_c(letters, collapse = "")
-
str_dup()
重复字符串`
fruit <- c("apple", "pear", "banana")
str_dup(fruit, 2)
str_dup(fruit, 1:3)
-
str_split()
拆分字符串,默认返回的是list,可设置simplify=T
参数返回矩阵
fruits <- c(
"apples and oranges and pears and bananas",
"pineapples and mangos and guavas"
)
str_split(fruits, " and ")
str_split(fruits, " and ", simplify=T)
#限定分割得到的字符串的数量(从左到右)
str_split(fruits, " and ", n = 2)
str_split(fruits, " and ", n = 3)
str_split(fruits, " and ", n = 5)