R中匹配函数

在 R 中,字符串匹配是一个常见的任务,可以使用正则表达式或非正则表达式的方法来完成。以下是对这些方法的总结,包括在向量和数据框中的应用。

正则表达式匹配

常用函数
  1. grepl:

    • 功能:检查向量中的每个元素是否匹配某个正则表达式。

    • 返回值 :逻辑向量,匹配的元素返回 TRUE,不匹配的返回 FALSE。

    • 示例 :

      R 复制代码
      my_vector <- c("apple", "banana", "cherry", "date", "elderberry")
      matches <- grepl("a", my_vector)
      print(matches)  # 输出: [1]  TRUE  TRUE FALSE  TRUE  TRUE
  2. grep:

    • 功能:返回匹配正则表达式的元素的索引。

    • 返回值:整数向量,表示匹配的元素的索引。

    • 示例 :

      R 复制代码
      my_vector <- c("apple", "banana", "cherry", "date", "elderberry")
      indices <- grep("a", my_vector)
      print(indices)  # 输出: [1] 1 2 4 5
  3. sub 和 gsub:

    • sub:替换每个元素中第一次出现的匹配模式。

    • gsub:替换每个元素中所有出现的匹配模式。

    • 示例 :

      R 复制代码
      my_vector <- c("apple", "banana", "cherry", "date", "elderberry")
      sub_result <- sub("a", "X", my_vector)
      gsub_result <- gsub("a", "X", my_vector)
      print(sub_result)  # 输出: [1] "Xpple"  "bXnXnX" "cherry" "dXte"  "elderberry"
      print(gsub_result)  # 输出: [1] "Xpple"  "bXnXnX" "cherry" "dXte"  "elderXerry"
在数据框中使用
  • grepl 和 grep:

    • 可以对数据框的某一列使用 grepl 或 grep。

    • 示例 :

      R 复制代码
      my_df <- data.frame(
        name = c("Alice", "Bob", "Charlie", "David", "Eve"),
        description = c("apple lover", "banana fan", "cherry enthusiast", "date admirer", "elderberry connoisseur"),
        stringsAsFactors = FALSE
      )
      
      # 使用 grepl 检查 description 列中哪些行包含 "a"
      matches <- grepl("a", my_df$description)
      print(matches)  # 输出: [1]  TRUE  TRUE FALSE  TRUE  TRUE
      
      # 使用 grep 获取匹配的行索引
      indices <- grep("a", my_df$description)
      print(indices)  # 输出: [1] 1 2 4 5
  • sub 和 gsub:

    • 可以对数据框的某一列使用 sub 或 gsub。

    • 示例 :

      R 复制代码
      my_df <- data.frame(
        name = c("Alice", "Bob", "Charlie", "David", "Eve"),
        description = c("apple lover", "banana fan", "cherry enthusiast", "date admirer", "elderberry connoisseur"),
        stringsAsFactors = FALSE
      )
      
      # 使用 sub 替换 description 列中第一次出现的 "a"
      my_df$description <- sub("a", "X", my_df$description)
      print(my_df)

非正则表达式匹配

常用函数
  1. %in%:

    • 功能:检查向量中的元素是否存在于另一个向量中。

    • 返回值 :逻辑向量,匹配的元素返回 TRUE,不匹配的返回 FALSE。

    • 示例 :

      R 复制代码
      my_vector <- c("apple", "banana", "cherry", "date", "elderberry")
      search_vector <- c("banana", "date")
      matches <- my_vector %in% search_vector
      print(matches)  # 输出: [1] FALSE  TRUE FALSE  TRUE FALSE
  2. match:

    • 功能:返回向量中每个元素在另一个向量中的位置。

    • 返回值 :整数向量,表示匹配的元素的位置,未匹配的返回 NA。

    • 示例 :

      R 复制代码
      my_vector <- c("apple", "banana", "cherry", "date", "elderberry")
      search_vector <- c("banana", "date")
      indices <- match(my_vector, search_vector)
      print(indices)  # 输出: [1] NA  1 NA  2 NA
在数据框中使用
  • %in%:

    • 可以对数据框的某一列使用 %in%。

    • 示例 :

      R 复制代码
      my_df <- data.frame(
        name = c("Alice", "Bob", "Charlie", "David", "Eve"),
        description = c("apple lover", "banana fan", "cherry enthusiast", "date admirer", "elderberry connoisseur"),
        stringsAsFactors = FALSE
      )
      
      # 使用 %in% 检查 description 列中哪些行包含 "banana" 或 "date"
      search_vector <- c("banana fan", "date admirer")
      matches <- my_df$description %in% search_vector
      print(matches)  # 输出: [1] FALSE  TRUE FALSE  TRUE FALSE
  • match:

    • 可以对数据框的某一列使用 match。

    • 示例 :

      R 复制代码
      my_df <- data.frame(
        name = c("Alice", "Bob", "Charlie", "David", "Eve"),
        description = c("apple lover", "banana fan", "cherry enthusiast", "date admirer", "elderberry connoisseur"),
        stringsAsFactors = FALSE
      )
      
      # 使用 match 获取 description 列中每个元素在 search_vector 中的位置
      search_vector <- c("banana fan", "date admirer")
      indices <- match(my_df$description, search_vector)
      print(indices)  # 输出: [1] NA  1 NA  2 NA

总结

  • 正则表达式匹配:

    • grepl:检查匹配,返回逻辑向量。
    • grep:返回匹配的索引。
    • sub 和 gsub:替换匹配的内容。
  • 非正则表达式匹配:

    • %in%:检查元素是否存在于另一个向量中,返回逻辑向量。
    • match :返回元素在另一个向量中的位置,未匹配的返回 NA。

这些方法在向量和数据框中都可以使用,具体选择哪种方法取决于你的具体需求。

相关推荐
星夜离尘561 天前
MATLAB 工程实验:不等间隔流量积分,先把缺口与覆盖率说清楚
开发语言·matlab·时间戳·数据质量·数值积分
Ai-_Man1 天前
Meta Muse还是不可以导出左侧所有对话,只能点进去单条内容导出,方法不对吗?
开发语言·人工智能·ai·小程序·c#·1024程序员节
梓豪csd1 天前
消息订阅中心:谁该收到哪条通知
java·开发语言·人工智能·低代码·自动化·1024程序员节
学逆向的1 天前
C 枚举变量
c语言·开发语言·网络安全
Sakura_j_h_1 天前
Python 在定时任务里输出 emoji,UnicodeEncodeError 从哪来
开发语言·字符编码·windows·python·定时任务
临床数据科学和人工智能兴趣组1 天前
提取匹配模式的第一个值
人工智能·r语言·1024程序员节·r语言-4.2.1·临床试验·临床科研·科学问题
小成202303202651 天前
C++~07补充
开发语言·c++
2401_885885042 天前
国际语音C#接口怎么写?.NET环境下实现国际语音验证码批量下发
开发语言·c#·.net
程序猿乐锅2 天前
【从0-1学习Python | 第七篇】Python 面向对象基础
开发语言·笔记·后端·python·学习·1024程序员节