You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除R数据框content列中同row的keyword首次匹配内容?

移除DataFrame中content列对应keyword的首次出现

需求说明

当keyword列存在内容时,移除content列对应行中keyword内容的首次出现,保留后续重复出现的内容;keyword为空时,不修改content列内容。

示例数据

keyword <- c("Mr. Jones", "My uncle Sam", "Tom", "", "The librarian")
content <- c("Mr. Jones is drinking coffee", "My uncle Sam is sitting in the kitchen with my uncle Richard", "Tom is playing with Tom's family's dog", "Cassandra is jogging for her first time", "The librarian is jogging with her")
data <- data.frame(keyword, content)
data

你尝试的方法问题

  1. 使用gsub的方法会删除所有匹配的内容,不符合仅移除首次出现的需求:
data$content <- mapply(function(x,y)gsub(x,"",y) ,gsub(" ", "|",data$keyword),data$content)
  1. 自定义统计词数的函数因参数使用错误报错,错误信息:

Error in gsub(".*^\w+", z, v) : invalid 'replacement' argument

解决方案

使用sub函数(仅替换首次匹配)结合正则转义,处理空值情况:

# 定义处理函数
remove_first_keyword <- function(key, cont) {
  if (key == "") {
    return(cont)
  } else {
    # 转义keyword中的正则特殊字符,匹配开头的keyword及后续空格
    pattern <- paste0("^\\Q", key, "\\E\\s*")
    return(sub(pattern, "", cont))
  }
}

# 应用到数据框的每一行
data$content <- mapply(remove_first_keyword, data$keyword, data$content)

# 查看处理后的结果
print(data)

代码解释

  • sub与gsub的核心区别:sub只替换首次匹配的内容,正好满足需求;gsub会替换所有匹配项。
  • ^\\Q...\\E:转义keyword中的正则特殊字符(比如Mr. Jones里的点号),避免正则解析出错;\\s*匹配keyword后面的任意空格,确保移除后不会留下多余空格。
  • 增加空值判断:当keyword为空时直接返回原content,避免无效处理。

处理后的结果

keyword                                                                 content
1     Mr. Jones                                                 is drinking coffee
2 My uncle Sam is sitting in the kitchen with my uncle Richard
3           Tom                          is playing with Tom's family's dog
4                                      Cassandra is jogging for her first time
5 The librarian                                          is jogging with her

内容的提问来源于stack exchange,提问作者Leetram

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 09:35:26