R中字符串操作
简介
Stringr中包含3个主要的函数族
- 字符操作
- 空格处理
- 模式匹配
常用函数
在平常的数据分析工作中,经常要用到如下的函数
函数 | 操作 |
---|---|
str_length() | 获取字符串长度 |
str_sub() | 截取字符串 |
str_dup() | 复制字符串 |
str_pad() | 空格填充 |
str_trunc() | 截取字符串 |
str_trim() | 去除空格 |
str_split(str, "[:,]") | 拆分 |
str_c() str_c() |
拼接 |
str_detect() | 检测模式是否存在 |
str_subset() | 返回匹配的结果 |
str_count() | 统计匹配次数 |
str_locate() str_locate_all() |
匹配定位 |
str_extract() str_extract_all() |
提取匹配结果 |
str_match() str_match_all() |
分组匹配 |
str_replace() str_replace_all() |
替换匹配结果 |
字符操作
你可使用 str_length() 获取字符串长度
str_length("abc")
#> [1] 3
您可以使用str_sub() 访问单个字符。 它有三个参数:字符向量,起始位置和结束位置。
结束位置可以是从第一个字符开始计数的正整数,或从最后一个字符计数的负整数。 闭区间,如果位置长于字符串,将被截断。
library("stringr")
# 字符串向量
x <- c('abcdef', 'ghijkl')
str_sub(x, 3, 3)
#[1] "c" "i"
str_sub(x, 2, -2)
#1] "bcde" "hijk"
# 字符串
str_x <- 'abcdef'
str_sub(str_x, 3, 4)
#[1] "cd"
# 修改字符串
str_sub(x, 3, 3) <- "X"
#[1] "abXdef" "ghXjkl"
# 复制字符串
str_dup(x, c(2, 3))
#[1] "abXdefabXdef" "ghXjklghXjklghXjkl"
# 第一个字符串复制两遍,第二个字符串复制3遍
空格处理
str_pad() 通过在左侧,右侧或两侧添加多余的空格将字符串填充到固定长度。
# 左侧填充空格,长度10位
x <- c("abc", "defghi")
str_pad(x, 10)
#[1] " abc" " defghi"
str_pad(x, 10, "both")
[1] " abc " " defghi "
# 填充指定的字符 使用pad参数,注意,pad的参数只能是单个字符
str_pad(x, 10, pad = 'x')
#[1] "xxxxxxxabc" "xxxxdefghi"
str_pad() 永远不会剪裁字符串
str_pad(x, 4)
#> [1] " abc" "defghi"
如果你想确保所有的字符串长度一样,可以结合str_pad() and str_trunc()一起使用:
x <- c("Short", "This is a long string")
x %>%
str_trunc(10) %>%
str_pad(10, "right")
#[1] "Short " "This is..."
str_trim() 和 str_pad() 功能相反, 主要功能是去除头尾的空格
x <- c(" a ", "b ", " c")
str_trim(x)
#> [1] "a" "b" "c"
str_trim(x, "left")
#> [1] "a " "b " "c"
可以使用str_wrap() 来修改现有的空格,以便包装一段文本,使每行的长度尽可能相似。
jabberwocky <- str_c(
"`Twas brillig, and the slithy toves ",
"did gyre and gimble in the wabe: ",
"All mimsy were the borogoves, ",
"and the mome raths outgrabe. "
)
cat(str_wrap(jabberwocky, width = 40))
#> `Twas brillig, and the slithy toves did
#> gyre and gimble in the wabe: All mimsy
#> were the borogoves, and the mome raths
#> outgrabe.
模式匹配
我们在其他语言处理字符串时会经常使用正则表达式,我们来看看R中的正则用法
我们先来看个电话号码的例子
strings <- c(
"apple",
"219 733 8965",
"329-293-8753",
"Work: 579-499-7527; Home: 543.355.3679"
)
phone <- "([2-9][0-9]{2})[- .]([0-9]{3})[- .]([0-9]{4})"
- str_detect() 检测模式是否存在,并返回一个逻辑向量,功能类似于 grepl()
# Which strings contain phone numbers?
str_detect(strings, phone)
#> [1] FALSE TRUE TRUE TRUE
- str_subset() 返回匹配正则表达式的字符向量的元素, 功能类似于 grep()
str_subset(strings, phone)
#> [1] "219 733 8965"
#> [2] "329-293-8753"
#> [3] "Work: 579-499-7527; Home: 543.355.3679"
- str_count() 统计匹配的次数
str_count(strings, phone)
#> [1] 0 1 1 2
- str_locate() 定位模式匹配的第一个位子,并返回一个带有开始和结束列的数字矩阵
str_locate_all() 定位所有的匹配,并返回带有开始和结束列的矩阵列表
# Where in the string is the phone number located?
(loc <- str_locate(strings, phone))
#> start end
#> [1,] NA NA
#> [2,] 1 12
#> [3,] 1 12
#> [4,] 7 18
str_locate_all(strings, phone)
#> [[1]]
#> start end
#>
#> [[2]]
#> start end
#> [1,] 1 12
#>
#> [[3]]
#> start end
#> [1,] 1 12
#>
#> [[4]]
#> start end
#> [1,] 7 18
#> [2,] 27 38
- str_extract() 提取第一个匹配到的文本,并返回字符向量
str_extract_all() 提取所有匹配到的文本,返回一堆字符向量
# What are the phone numbers?
str_extract(strings, phone)
#> [1] NA "219 733 8965" "329-293-8753" "579-499-7527"
str_extract_all(strings, phone)
#> [[1]]
#> character(0)
#>
#> [[2]]
#> [1] "219 733 8965"
#>
#> [[3]]
#> [1] "329-293-8753"
#>
#> [[4]]
#> [1] "579-499-7527" "543.355.3679"
str_extract_all(strings, phone, simplify = TRUE)
#> [,1] [,2]
#> [1,] "" ""
#> [2,] "219 733 8965" ""
#> [3,] "329-293-8753" ""
#> [4,] "579-499-7527" "543.355.3679"
- str_match() 分组匹配,从第一个匹配中提取匹配结果,返回一个字符矩阵,第一列返回完全匹配结果,其他列返回每组匹配结果
str_match_all() 从所有匹配中提取匹配结果,返回一个字符矩阵列表
# Pull out the three components of the match
str_match(strings, phone)
#> [,1] [,2] [,3] [,4]
#> [1,] NA NA NA NA
#> [2,] "219 733 8965" "219" "733" "8965"
#> [3,] "329-293-8753" "329" "293" "8753"
#> [4,] "579-499-7527" "579" "499" "7527"
str_match_all(strings, phone)
#> [[1]]
#> [,1] [,2] [,3] [,4]
#>
#> [[2]]
#> [,1] [,2] [,3] [,4]
#> [1,] "219 733 8965" "219" "733" "8965"
#>
#> [[3]]
#> [,1] [,2] [,3] [,4]
#> [1,] "329-293-8753" "329" "293" "8753"
#>
#> [[4]]
#> [,1] [,2] [,3] [,4]
#> [1,] "579-499-7527" "579" "499" "7527"
#> [2,] "543.355.3679" "543" "355" "3679"
- str_replace() 替换第一个匹配的结果
str_replace_all() 替换所有匹配到的结果
str_replace(strings, phone, "XXX-XXX-XXXX")
#> [1] "apple"
#> [2] "XXX-XXX-XXXX"
#> [3] "XXX-XXX-XXXX"
#> [4] "Work: XXX-XXX-XXXX; Home: 543.355.3679"
str_replace_all(strings, phone, "XXX-XXX-XXXX")
#> [1] "apple"
#> [2] "XXX-XXX-XXXX"
#> [3] "XXX-XXX-XXXX"
#> [4] "Work: XXX-XXX-XXXX; Home: XXX-XXX-XXXX"
- str_split() 分隔字符串
str_split("a-b-c", "-")
#> [[1]]
#> [1] "a" "b" "c"
- str_c(str_vec, collapse=",") 拼接向量
x <- c('a', 'b', 'c')
str_c(x, collapse = ',')
#[1] "a,b,c"
参考资料
- Introduction to stringr
- 左手python,右手R python和R的异同可以参考这篇文章
R中字符串操作的更多相关文章
- Python中字符串操作
#Python字符串操作 '''1.复制字符串''' #strcpy(sStr1,sStr2) sStr1 = 'strcpy' sStr2 = sStr1 sStr1 = 'strcpy2' pri ...
- Python中字符串操作函数string.split('str1')和string.join(ls)
Python中的字符串操作函数split 和 join能够实现字符串和列表之间的简单转换, 使用 .split()可以将字符串中特定部分以多个字符的形式,存储成列表 def split(self, * ...
- shell中字符串操作【转】
转自:http://blog.chinaunix.net/uid-29091195-id-3974751.html 我们所遇到的编程语言中(汇编除外)都少不了字符串处理函数吧,当然shell编程也不例 ...
- python中字符串操作--截取,查找,替换
python中,对字符串的操作是最常见的,python对字符串操作有自己特殊的处理方式. 字符串的截取 python中对于字符串的索引是比较特别的,来感受一下: s = '123456789' #截取 ...
- R中双表操作学习[转载]
转自:https://www.jianshu.com/p/a7af4f6e50c3 1.原始数据 以上是原有的一个,再生成一个新的: > gene_exp_tidy2 <- data.fr ...
- VB中字符串操作函数
Len Len(string|varname) 返回字符串内字符的数目,或是存储一变量所需的字节数. Trim Trim(string) 将字符串前后的空格去掉 Ltrim Ltrim(string) ...
- JAVA中字符串操作几种方式对比
@参考文章 方法及原理: 方法1:a=a+b实际上另开辟一个空间c=a+b;然后将c的引用赋给a 方法2:a += b实际上是建立一个StringBuffer,然后调用append(),最后再将Str ...
- IOS中字符串操作
1.比较大小 - (NSComparisonResult)compare:(NSString *)string; 返回值NSComparisonResult有3种情况: NSOrderedAscend ...
- Java中字符串操作的基本方法总结:
1.字母大小写转换: package com.imooc; public class SortDemo { public static void main(String[] args) { char ...
随机推荐
- 验证resneXt,densenet,mobilenet和SENet的特色结构
简介 图像分类对网络结构的要求,一个是精度,另一个是速度.这两个需求推动了网络结构的发展. resneXt:分组卷积,降低了网络参数个数. densenet:密集的跳连接. mobilenet:标准卷 ...
- Vim实用技巧系列 - 开篇
作者使用Vim已经有一段时间了,深深觉得它是一个非常强大的编辑器,使用习惯之后效率很高.最大的缺点是学习曲线比较陡峭.因此作者希望分享一些自己在实际使用中的经验来帮助初学者,同时也帮助作者自己学习. ...
- vba调用c#dll
本文阐述如何用C#创建COM组件,并能用VB6.0等调用.附有完整测试通过的代码.该功能总体看来很简单,实际值得注意的地方还是挺多.因为很少有人写这类文章,有些代码也是转来转去的不全,有些甚至让人误入 ...
- 3、Xamarin Forms 调整安卓TabbedPage 下置
降低学习成本是每个.NET传教士义务与责任. 建立生态,保护生态,见者有份. 教程晦涩难懂是我的错误. 对于默认的TabbedPage 上面进行页面切换 上面是安卓默认的情况 对我们大部分人来说都 ...
- Java Web入门学习(三)Maven的配置与使用国内仓库
一.Maven下载与配置 下载好的压缩包,压缩到D盘,或者其他盘符. 新建系统环境变量 MAVEN_HOME 值是压缩好的Maven目录. 比如: D:\apache-maven- 在path环境变 ...
- HTML页面的重绘(repaint)和重流(reflow)
重流(Reflow)是指布局引擎为frame计算图形的过程. frame是一个矩形,拥有宽高和相对父容器的偏移.frame用来显示盒模型(content model), 但一个content mode ...
- EF基础知识小记六(使用Code First建模自引用关系,常用于系统菜单、文件目录等有层级之分的实体)
日常开发中,经常会碰到一些自引用的实体,比如系统菜单.目录实体,这类实体往往自己引用自己,所以我们必须学会使用Code First来建立这一类的模型. 以下是自引用表的数据库关系图: ok,下面开始介 ...
- 第7章—SpringMVC高级技术—处理异常
处理异常 处理异常 不管发生什么事情,不管是好的还是坏的,Servlet请求的输出都是一个Servlet响应.如果在请求处理的时候,出现了异常,那它的输出依然会是Servlet响应.异常必须要以某种方 ...
- java c :foreach 标签怎么获取自增分页序号
问题描述: 如果每页10条,下一页就从11递增,依次类推:用varStatus,下一页又从1开始了 解决方案: <c:forEach var="pag" begin=&quo ...
- springweb flux 服务器推送事件
以前做服务器推送一般用轮询,后端主动给客户端推送不是很好解决.有时候也可以采用websocket 现在看了springwebflux,用它自带的方法做服务器推送方便多了. 代码如下: import o ...