r语言 - 如何删除出现在另一列中的特定行的第一个单词?



是否有办法删除列的前n个单词"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

在某些情况下,"键盘"的前几个单词链接包含在"内容"中。字符串。在其他情况下,"关键词"字符串仍然为空,只有"content"填满。

我想在这里实现的是删除"keyword"中的单词组合的第一个外观。它出现在"内容"的同一行中。不幸的是,我只能创建删除所有匹配单词的代码。但正如你所看到的,有些词(比如"叔叔")或"Tom")在单元格中出现不止一次。我想只删除第一个外观,并在同一单元格中保留所有之后的外观。

我的次优解决方案是使用以下代码:

data$content <- mapply(function(x,y)gsub(x,"",y) ,gsub(" ", "|",data$keyword),data$content)

这段代码的目的是删除"content"出现在关键词中在同一行。(文章最初发布于此处)。

我尝试的另一个选项是为这个设计一个函数:我首先创建了一个新变量,用于计算"关键字"中包含的单词数量。对应行的字符串:

numw <- lengths(gregexpr("\S+", data$keyword))
data <- cbind(data, numw)

其次,我尝试用n = numw[I]

构造一个函数来删除内容[I]的前n个单词
shorten <- function(v, z){
v <- gsub(".*^\w+", z, v)
}
shorten(data$content, data$numw)

不幸的是,我无法使该函数工作,将生成以下错误消息:

gsub(".*^w+", z, v)错误:无效的'replacement'参数

所以,如果有人能帮我制定一个能更恰当地处理这个问题的函数,我将非常感激。

这是一个基于str_remove的解决方案。由于str_remove给出警告,如果模式是'',则第一行将其与NA交换。如果keywordNA,则去掉keyword;如果不是,则去掉content

library(tidyverse )
data |> 
mutate(keyword = na_if(keyword, '')) |> 
mutate(content = case_when(
!is.na(keyword) ~ str_remove(content, keyword),
is.na(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          <NA>          Cassandra is jogging for her first time
#> 5 The librarian                              is jogging with her