简介

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() 获取字符串长度

  1. str_length("abc")
  2. #> [1] 3

您可以使用str_sub() 访问单个字符。 它有三个参数:字符向量,起始位置和结束位置。

结束位置可以是从第一个字符开始计数的正整数,或从最后一个字符计数的负整数。 闭区间,如果位置长于字符串,将被截断。

  1. library("stringr")
  2. # 字符串向量
  3. x <- c('abcdef', 'ghijkl')
  4. str_sub(x, 3, 3)
  5. #[1] "c" "i"
  6. str_sub(x, 2, -2)
  7. #1] "bcde" "hijk"
  8. # 字符串
  9. str_x <- 'abcdef'
  10. str_sub(str_x, 3, 4)
  11. #[1] "cd"
  12. # 修改字符串
  13. str_sub(x, 3, 3) <- "X"
  14. #[1] "abXdef" "ghXjkl"
  15. # 复制字符串
  16. str_dup(x, c(2, 3))
  17. #[1] "abXdefabXdef" "ghXjklghXjklghXjkl"
  18. # 第一个字符串复制两遍,第二个字符串复制3遍

空格处理

str_pad() 通过在左侧,右侧或两侧添加多余的空格将字符串填充到固定长度。

  1. # 左侧填充空格,长度10位
  2. x <- c("abc", "defghi")
  3. str_pad(x, 10)
  4. #[1] " abc" " defghi"
  5. str_pad(x, 10, "both")
  6. [1] " abc " " defghi "
  7. # 填充指定的字符 使用pad参数,注意,pad的参数只能是单个字符
  8. str_pad(x, 10, pad = 'x')
  9. #[1] "xxxxxxxabc" "xxxxdefghi"

str_pad() 永远不会剪裁字符串

  1. str_pad(x, 4)
  2. #> [1] " abc" "defghi"

如果你想确保所有的字符串长度一样,可以结合str_pad() and str_trunc()一起使用:

  1. x <- c("Short", "This is a long string")
  2. x %>%
  3. str_trunc(10) %>%
  4. str_pad(10, "right")
  5. #[1] "Short " "This is..."

str_trim() 和 str_pad() 功能相反, 主要功能是去除头尾的空格

  1. x <- c(" a ", "b ", " c")
  2. str_trim(x)
  3. #> [1] "a" "b" "c"
  4. str_trim(x, "left")
  5. #> [1] "a " "b " "c"

可以使用str_wrap() 来修改现有的空格,以便包装一段文本,使每行的长度尽可能相似。

  1. jabberwocky <- str_c(
  2. "`Twas brillig, and the slithy toves ",
  3. "did gyre and gimble in the wabe: ",
  4. "All mimsy were the borogoves, ",
  5. "and the mome raths outgrabe. "
  6. )
  7. cat(str_wrap(jabberwocky, width = 40))
  8. #> `Twas brillig, and the slithy toves did
  9. #> gyre and gimble in the wabe: All mimsy
  10. #> were the borogoves, and the mome raths
  11. #> outgrabe.

模式匹配

我们在其他语言处理字符串时会经常使用正则表达式,我们来看看R中的正则用法

我们先来看个电话号码的例子

  1. strings <- c(
  2. "apple",
  3. "219 733 8965",
  4. "329-293-8753",
  5. "Work: 579-499-7527; Home: 543.355.3679"
  6. )
  7. phone <- "([2-9][0-9]{2})[- .]([0-9]{3})[- .]([0-9]{4})"
  1. str_detect() 检测模式是否存在,并返回一个逻辑向量,功能类似于 grepl()
  1. # Which strings contain phone numbers?
  2. str_detect(strings, phone)
  3. #> [1] FALSE TRUE TRUE TRUE
  1. str_subset() 返回匹配正则表达式的字符向量的元素, 功能类似于 grep()
  1. str_subset(strings, phone)
  2. #> [1] "219 733 8965"
  3. #> [2] "329-293-8753"
  4. #> [3] "Work: 579-499-7527; Home: 543.355.3679"
  1. str_count() 统计匹配的次数
  1. str_count(strings, phone)
  2. #> [1] 0 1 1 2
  1. str_locate() 定位模式匹配的第一个位子,并返回一个带有开始和结束列的数字矩阵

    str_locate_all() 定位所有的匹配,并返回带有开始和结束列的矩阵列表
  1. # Where in the string is the phone number located?
  2. (loc <- str_locate(strings, phone))
  3. #> start end
  4. #> [1,] NA NA
  5. #> [2,] 1 12
  6. #> [3,] 1 12
  7. #> [4,] 7 18
  8. str_locate_all(strings, phone)
  9. #> [[1]]
  10. #> start end
  11. #>
  12. #> [[2]]
  13. #> start end
  14. #> [1,] 1 12
  15. #>
  16. #> [[3]]
  17. #> start end
  18. #> [1,] 1 12
  19. #>
  20. #> [[4]]
  21. #> start end
  22. #> [1,] 7 18
  23. #> [2,] 27 38
  1. str_extract() 提取第一个匹配到的文本,并返回字符向量

    str_extract_all() 提取所有匹配到的文本,返回一堆字符向量
  1. # What are the phone numbers?
  2. str_extract(strings, phone)
  3. #> [1] NA "219 733 8965" "329-293-8753" "579-499-7527"
  4. str_extract_all(strings, phone)
  5. #> [[1]]
  6. #> character(0)
  7. #>
  8. #> [[2]]
  9. #> [1] "219 733 8965"
  10. #>
  11. #> [[3]]
  12. #> [1] "329-293-8753"
  13. #>
  14. #> [[4]]
  15. #> [1] "579-499-7527" "543.355.3679"
  16. str_extract_all(strings, phone, simplify = TRUE)
  17. #> [,1] [,2]
  18. #> [1,] "" ""
  19. #> [2,] "219 733 8965" ""
  20. #> [3,] "329-293-8753" ""
  21. #> [4,] "579-499-7527" "543.355.3679"
  1. str_match() 分组匹配,从第一个匹配中提取匹配结果,返回一个字符矩阵,第一列返回完全匹配结果,其他列返回每组匹配结果

    str_match_all() 从所有匹配中提取匹配结果,返回一个字符矩阵列表
  1. # Pull out the three components of the match
  2. str_match(strings, phone)
  3. #> [,1] [,2] [,3] [,4]
  4. #> [1,] NA NA NA NA
  5. #> [2,] "219 733 8965" "219" "733" "8965"
  6. #> [3,] "329-293-8753" "329" "293" "8753"
  7. #> [4,] "579-499-7527" "579" "499" "7527"
  8. str_match_all(strings, phone)
  9. #> [[1]]
  10. #> [,1] [,2] [,3] [,4]
  11. #>
  12. #> [[2]]
  13. #> [,1] [,2] [,3] [,4]
  14. #> [1,] "219 733 8965" "219" "733" "8965"
  15. #>
  16. #> [[3]]
  17. #> [,1] [,2] [,3] [,4]
  18. #> [1,] "329-293-8753" "329" "293" "8753"
  19. #>
  20. #> [[4]]
  21. #> [,1] [,2] [,3] [,4]
  22. #> [1,] "579-499-7527" "579" "499" "7527"
  23. #> [2,] "543.355.3679" "543" "355" "3679"
  1. str_replace() 替换第一个匹配的结果

    str_replace_all() 替换所有匹配到的结果
  1. str_replace(strings, phone, "XXX-XXX-XXXX")
  2. #> [1] "apple"
  3. #> [2] "XXX-XXX-XXXX"
  4. #> [3] "XXX-XXX-XXXX"
  5. #> [4] "Work: XXX-XXX-XXXX; Home: 543.355.3679"
  6. str_replace_all(strings, phone, "XXX-XXX-XXXX")
  7. #> [1] "apple"
  8. #> [2] "XXX-XXX-XXXX"
  9. #> [3] "XXX-XXX-XXXX"
  10. #> [4] "Work: XXX-XXX-XXXX; Home: XXX-XXX-XXXX"
  1. str_split() 分隔字符串
  1. str_split("a-b-c", "-")
  2. #> [[1]]
  3. #> [1] "a" "b" "c"
  1. str_c(str_vec, collapse=",") 拼接向量
  1. x <- c('a', 'b', 'c')
  2. str_c(x, collapse = ',')
  3. #[1] "a,b,c"

参考资料

R中字符串操作的更多相关文章

  1. Python中字符串操作

    #Python字符串操作 '''1.复制字符串''' #strcpy(sStr1,sStr2) sStr1 = 'strcpy' sStr2 = sStr1 sStr1 = 'strcpy2' pri ...

  2. Python中字符串操作函数string.split('str1')和string.join(ls)

    Python中的字符串操作函数split 和 join能够实现字符串和列表之间的简单转换, 使用 .split()可以将字符串中特定部分以多个字符的形式,存储成列表 def split(self, * ...

  3. shell中字符串操作【转】

    转自:http://blog.chinaunix.net/uid-29091195-id-3974751.html 我们所遇到的编程语言中(汇编除外)都少不了字符串处理函数吧,当然shell编程也不例 ...

  4. python中字符串操作--截取,查找,替换

    python中,对字符串的操作是最常见的,python对字符串操作有自己特殊的处理方式. 字符串的截取 python中对于字符串的索引是比较特别的,来感受一下: s = '123456789' #截取 ...

  5. R中双表操作学习[转载]

    转自:https://www.jianshu.com/p/a7af4f6e50c3 1.原始数据 以上是原有的一个,再生成一个新的: > gene_exp_tidy2 <- data.fr ...

  6. VB中字符串操作函数

    Len Len(string|varname) 返回字符串内字符的数目,或是存储一变量所需的字节数. Trim Trim(string) 将字符串前后的空格去掉 Ltrim Ltrim(string) ...

  7. JAVA中字符串操作几种方式对比

    @参考文章 方法及原理: 方法1:a=a+b实际上另开辟一个空间c=a+b;然后将c的引用赋给a 方法2:a += b实际上是建立一个StringBuffer,然后调用append(),最后再将Str ...

  8. IOS中字符串操作

    1.比较大小 - (NSComparisonResult)compare:(NSString *)string; 返回值NSComparisonResult有3种情况: NSOrderedAscend ...

  9. Java中字符串操作的基本方法总结:

    1.字母大小写转换: package com.imooc; public class SortDemo { public static void main(String[] args) { char ...

随机推荐

  1. 【xsy2748】 fly 矩阵快速幂

    题目大意:有$n$个点,$m$条有向边,其中第$i$条边需要在$t_i$秒后才出现在图上. 有一个人刚开始呆在$1$号节点,每秒钟他必须要选择一条从他所在位置走出去的边,走出去(如果没有的话这人就死了 ...

  2. (转)更换镜像rootvg卷组中的硬盘

    F85系统镜像盘更换实录之一:删除原有镜像操作 # cfgmgr # lsdev -Cc disk hdisk0 Available 11-09-00-8,0  16 Bit LVD SCSI Dis ...

  3. MySQL 5.7.21版本sql_mode=only_full_group_by问题

      用到GROUP BY 语句查询时com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expression #2 of SELECT ...

  4. android GridLayout布局

    android4.0版本后新增了一个GridLayout,它使用虚细线将布局划分为行.列和单元格,也支持一个控件在行.列上都有交错排列,其实用方法和LinearLayout,Relativelayou ...

  5. MediaWIKI部署流程

    1.下载mediawiki,地址:https://www.mediawiki.org/wiki/MediaWiki 2.下载xxamp集成软件,地址:https://www.apachefriends ...

  6. centos7 Mariadb5.5升级到Mariadb10.2

    一次升级过程,在此记录下. 原因:新的项目需要新的数据库版本支持. 升级主要步骤: 备份原数据库 --->卸载mariadb --->添加mariadb国内yum源 --->安装ma ...

  7. Java中float和double转换的问题

    为什么double转float不会出现数据误差,而float转double却误差如此之大?   double d = 3.14; float f = (float)d; System.out.prin ...

  8. 说说java

    先说什么是java java是一种面向对象语言,真正的面向对象,任何函数和变量都以类(class)封装起来 至于什么是对象什么是类,我就不废话了 关于这两个概念的解释任何一本面向对象语言的教材里面都有 ...

  9. Fiddler——PC上实现手机的抓包(转载 http://www.jianshu.com/p/13f8a81d7c7c)

    Fiddler是15年初,在千牛中做超级促销插件时,发现没有root的Android机和没有越狱的iPhone无法修改host,因此没办法测试.为了让我这个磨人的PD也能看到,开发推荐了Fiddler ...

  10. [CQOI 2018]交错序列

    Description 题库链接 定义长度为 \(n\) 的"交错序列"为:长度为 \(n\) 序列中仅含 \(0,1\) 且没有相邻的 \(1\) .给出 \(a,b\) ,假设 ...