R:具有标记化和%like%的自建函数仅对第一个标记有效

R:具有标记化和%like%的自建函数仅对第一个标记有效,r,function,dataframe,comparison,tokenize,R,Function,Dataframe,Comparison,Tokenize,我有一个两列的数据框,第二列(unit)主要包含第一列(str)的第一个字。请在下面查看: > df <- data.frame(str = c("cups vegetable soup", "cup brown lentils", "carrot", "stalks celery"), unit = c("cups", "cup", NA, "stalks"), stringsAsFactors = FALSE) > df str u

我有一个两列的数据框,第二列(unit)主要包含第一列(str)的第一个字。请在下面查看:

> df <- data.frame(str = c("cups vegetable soup", "cup brown lentils", "carrot", "stalks celery"), unit = c("cups", "cup", NA, "stalks"), stringsAsFactors = FALSE)

> df
                  str   unit
1 cups vegetable soup   cups
2   cup brown lentils    cup
3              carrot   <NA>
4       stalks celery stalks
>测向
str单元
1杯蔬菜汤杯
2杯棕色扁豆杯
3胡萝卜
4茎芹菜茎
如果$str的第一个字与$unit对应的值(在同一行)匹配,我想删除它

对于该范围,我创建了如下所示的函数“DelFunction”:

 DelFunction <- function(x, y) {
  tokens_x <- x[[1]]
  tokens_y <- y[[1]]
  if ((tokens_x %like% tokens_y) == TRUE) {
    regmatches(tokens_x, regexpr("[a-z]+", tokens_x)) <- ""
  }
  tokens_x
}
DelFunction可能的答案:

库(stringr)
库(dplyr,warn.conflicts=FALSE)
df%
突变(str=trimws(str_替换(str,单位,)))%>%
突变(str=if_else(is.na(单位),df$str,str))->df2
df2
#>str单元
#>1个蔬菜汤杯
#>2个棕色扁豆杯
#>3胡萝卜
#>4根芹菜茎
在不改变(大量)原始代码的情况下,另一个可能的答案是:


库(描述工具)

太棒了,谢谢!我可以问一下为什么我的代码不起作用/不能起作用吗?请参阅更新的答案。顺便说一句:下次请包括您的代码依赖项,即
DescTools
。感谢您的提醒,rmagno。我还可以问你为什么同时粘贴y和%符号吗?在你发表文章之前,我没有使用过
DescTools::
%like%`但我查了一下来回答你的问题。在“帮助”页面的示例中显示,我们需要使用
%
作为任何字符的通配符。因此,为了使
%like%
表达式能够匹配以
标记值开始的任何内容,我必须按照文档中的说明附加
%
df$str<- sapply(df$str, DelFunction, df$unit)
> df
                str   unit
1    vegetable soup   cups
2 cup brown lentils    cup
3            carrot   <NA>
4     stalks celery stalks
> df
                str   unit
1    vegetable soup   cups
2    brown lentils    cup
3            carrot   <NA>
4             celery stalks