搜索
查看: 668|回复: 0

[R] 慧美——R fot data science 第10章 使用stringr处理字符串

[复制链接]

39

主题

40

帖子

295

积分

中级会员

Rank: 3Rank: 3

积分
295
发表于 2018-11-27 08:14:34 | 显示全部楼层 |阅读模式
R fot data science 第10章  使用stringr处理字符串10.1  简介
  • 学习R 中的字符串处理。你将学习字符串的基本工作原理
  • 正则表达式的用处非常大,字符串通常包含的是非结构化或半结构化数据,正则表达式可以用简练的语言来描述字符串中的模式。
  • 准备工作
    library(tidyverse)
    library(stringr)
10.2  字符串基础
  • 可以使用单引号或双引号来创建字符串。与其他语言不同,单引号和双引号在 R 中没有区别。
  • 如果想要在字符串中包含一个单引号或双引号,可以使用 \ 对其进行“转义”
    double_quote<-"\""# or '"'
    single_quote<-'\''# or "'"
    如果想要在字符串中包含一个反斜杠,就需要使用两个反斜杠:\
  • 如果想要查看字符串的初始内容,可以使用 writelines() 函数
    x<-c("\"", "\\")
    x
    #> [1] "\"" "\\"
    writeLines(x)
  • 最常用的是换行符 \n 和制表符 \t
  • 多个字符串通常保存在一个字符向量中,你可以使用 c() 函数来创建字符向量
  • 字符串长度
    • str_length() 函数可以返回字符串中的字符数量

    file:///Users/huimei/Library/Application%20Support/typora-user-images/image-20181126151126078.png?lastModify=1543277617
  • 字符串组合
    • 组合两个或更多字符串,可以使用 str_c() 函数
    • 和多数 R 函数一样,缺失值是可传染的。如果想要将它们输出为 "NA",可以使用 str_replace_na()
    • 要想将字符向量合并为字符串,可以使用 collapse() 函数

  • 字符串取子集
    • 可以使用 str_sub() 函数来提取字符串的一部分。除了字符串参数外,str_sub() 函数中还有 start 和 end 参数,它们给出了子串的位置(包括 start 和 end 在内)

  • 区域设置
    • str_to_lower() 函数将文本转换为小写
    • str_to_upper() 函数
    • str_to_title() 函数
    • R 基础包中的 order() 和 sort() 函数使用当前区域设置对字符串进行排序。


10.3 使用正则表达式进行模式匹配
  • 基础匹配
    • 最简单的模式是精确匹配字符串


  • 锚点
    • 正则表达式会匹配字符串的任意部分。有时我们需要在正则表达式中设置锚点,以便 R 从字符串的开头或末尾进行匹配
      • ^ 从字符串开头进行匹配。
        x<-c("apple", "banana", "pear")
        str_view(x, "^a")
      • $ 从字符串末尾进行匹配。



str_view(x, "a$")
  • 如果想要强制正则表达式匹配一个完整字符串,那么可以同时设置 ^ 和 $ 这两个锚点

x<-c("apple pie", "apple", "apple cake")
str_view(x, "apple")
str_view(x, "^apple$")
  • 字符类与字符选项
    • \d 可以匹配任意数字。
    • \s 可以匹配任意空白字符(如空格、制表符和换行符)。
    • [abc] 可以匹配 a、b 或 c。
    • [^abc] 可以匹配除 a、b、c 外的任意字符。

  • 重复
    • 可以控制一个模式能够匹配多少次
      • ?:0次或1次。
      • +:1 次或多次。
      • *:0 次或多次。

    • 可以精确设置匹配的次数
      • {n}:匹配 n 次。
      • {n,}:匹配 n 次或更多次。
      • {,m}:最多匹配 m 次。
      • {n, m}:匹配n到m次。

    • 默认的匹配方式是“贪婪的”:正则表达式会匹配尽量长的字符串。通过在正则表达式后 面添加一个 ?,你可以将匹配方式更改为“懒惰的”,即匹配尽量短的字符串

  • 分组与回溯引用
    • 通过回溯引用(如 \1、\2 等)来引用这些分组


10.4  工具
  • 多种 stringr 函数,它们可以
    • 确定与某种模式相匹配的字符串;
    • 找出匹配的位置;
    • 提取出匹配的内容;
    • 使用新值替换匹配内容;
    • 基于匹配拆分字符串。

  • 匹配检测
    • 要想确定一个字符向量能否匹配一种模式,可以使用 str_detect() 函数。它返回一个与输入向量具有同样长度的逻辑向量
      file:///Users/huimei/Library/Application%20Support/typora-user-images/image-20181126182858170.png?lastModify=1543277617


  • str_detect() 函数的一种变体是 str_count(),后者不是简单地返回是或否,而是返回字符串中匹配的数量

  • 很多 stringr 函数都是成对出现的:一个函数用于单个匹配,另一个函数用于全部匹配,后者会有后缀 _all。
  • 要想提取匹配的实际文本,我们可以使用 str_extract() 函数

  • 分组匹配
    • 括号在正则表达式中的用法
    • 它可以阐明优先级
    • 能对正则表达式进行分组
    • 分组可以在匹配时回溯引用

  • 替换匹配内容
    • str_replace() 和 str_replace_all() 函数可以使用新字符串替换匹配内容。最简单的应用 是使用固定字符串替换匹配内容

    • 通过提供一个命名向量,使用 str_replace_all() 函数可以同时执行多个替换
      • file:///Users/huimei/Library/Application%20Support/typora-user-images/image-20181126191354546.png?lastModify=1543277617


  • 拆分
    • str_split() 函数可以将字符串拆分为多个片段

  • 定位匹配内容
    • str_locate() 和 str_locate_all() 函数可以给出每个匹配的开始位置和结束位置。可以使用 str_locate() 函数找出匹配的模式,然后使用 str_sub() 函数来提取或修改匹配的内容


10.5  其他类型的模式
  • 当使用一个字符串作为模式时,R 会自动调用 regex() 函数对其进行包装

  • 你可以使用 regex() 函数的其他参数来控制具体的匹配方式
    • ignore_case = TRUE既可以匹配大写字母,也可以匹配小写字母,它总是使用当前的区域设置
    • multiline = TRUE可以使得^和$从每行的开头和末尾开始匹配,而不是从完整字符串的开头和末尾开始匹配
    • file:///Users/huimei/Library/Application%20Support/typora-user-images/image-20181127075821200.png?lastModify=1543277617


  • comments = TRUE可以让你在复杂的正则表达式中加入注释和空白字符,以便更易理解。匹配时会忽略空格和 # 后面的内容。如果想要匹配一个空格,你需要对其进行转义:"\ "

  • dotall = TRUE 可以使得 . 匹配包括 \n 在内的所有字符

  • fixed() 函数可以按照字符串的字节形式进行精确匹配,它会忽略正则表达式中的所有特殊字符,并在非常低的层次上进行操作。这样可以让你不用进行那些复杂的转义操作,而且速度比普通正则表达式要快很多。

  • coll() 函数使用标准排序规则来比较字符串,这在进行不区分大小写的匹配时是非常有效的。

  • 可以使用 boundary() 函数来匹配边界

10.6 正则表达式的其他应用
  • apropos() 函数可以在全局环境空间中搜索所有可用对象。当不能确切想起函数名称时, 这个函数特别有用

  • dir() 函数可以列出一个目录下的所有文件。dir() 函数的 patten 参数可以是一个正则 表达式,此时它只返回与这个模式相匹配的文件名。

  • 如果更喜欢使用 *.Rmd 这样的“通配符”,你可以通过 glob2rx() 函数将其转换为正则 表达式

10.7 stringi
  • stringr 建立于 stringi 的基础之上。stringr 非常容易学习,因为它只提供了非常少的函数

  • stringi 中有 234 个函数,而 stringr 中只有 42 个。

  • 如果你发现某些工作很难使用 stringr 来完成,那么可以考虑使用 stringi。因为这两个包中的函数的工作方式非常相似,所以你可以很自然地从 stringr 过渡到 stringi。主要区别是前缀:str_ 与 stri_。





上一篇:小洁详解《R数据科学》--第22章 R Markdown 输出格式
下一篇:GSEA分析数据
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|生信技能树 ( 粤ICP备15016384号  

GMT+8, 2019-11-21 10:02 , Processed in 0.028873 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.