是否有办法删除列的前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
交换。如果keyword
是NA
,则去掉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