如何在 R 数据框中的一列不同的字符串中找到一组精确的字符串?

How to find an exact set of strings in a column of varied strings in R dataframe?

我正在寻找与包含字符串的 R 数据框列中的一串字符串完全匹配的匹配项。

这是我的一堆参考字符串的格式,这些字符串将存储在变量 splitval:

library(gsubfn)
#Splitting each rule into its individual parameter elements
str <- strsplit(gsub("\,\+"," +", gsub("=>","",  gsubfn(".", list("{" = "", "}" = ""), gsub("corpsi", "+corpsi", "{dog} => {pet}")))), split='+', fixed=TRUE)
parameters <- data.frame(do.call(rbind, str)) #Creating a df of the split parameters
parameters <- data.frame(t(parameters))
parameters <- parameters[parameters$t.parameters.!="",]
parameters <- trimws(parameters, "r")

#Applying filter on all the parameters of a single rule row
splitval = strsplit(parameters[1],split=' ', fixed=TRUE)
splitval = lapply(list(splitval[[1]]), function(z){ z[z != ""]}) #Eliminating the "" instances

所以现在,splitval 具有以下值:

[[1]]
[1] "dog" "pet"

现在我的 objective 是过滤掉以下数据框的所有行条目,其中字符串列的条目同时包含确切的单词 dog宠物.

注意:它不应过滤掉包含 doganimal petsdogsareanimals 和 petssss

等短语的字符串

这是我的数据框:

df <- data.frame(Srno = 1:5, Description = c("dog is my pet", "doganimal pets country", "my pet is my dog", "dogsareanimals and petssss", "a pet dog is great"))

看起来像这样:

因此,我只需要摘录中的第 1、3 和 5 行,因为只有这些包含独占字符串“dog”和“pet”(无特定顺序)

但是当我使用下面的代码时,我得到了数据帧的所有行,因为所有字符串都包含引用的两个关键字 - grep 没有达到预期目的。

extract_df <- df[(grep(splitval[[1]][1], df$Description)),]
  for(k in 2:length(splitval[[1]]))
  {
    extract_df  <- extract_df[(grep(splitval[[1]][k], df$Description)),]
  }

谁能帮我在提取的输出数据框中只获取第 1、3 和 5 行?

假设 splitval 中可以有很多词并且不会总是有两个固定的词,你可以为每个词拆分字符串和 select 行 all vec.

中的单词

在 base R 中,您可以这样做:

vec <- splitval[[1]]
#For this case
#vec <- c("dog", "pet")

subset(df, sapply(strsplit(df$Description, '\s+'), function(x) all(vec %in% x)))

#  Srno        Description
#1    1      dog is my pet
#3    3   my pet is my dog
#5    5 a pet dog is great

使用tidyverse

library(tidyverse)
df %>% filter(map_lgl(str_split(df$Description, '\s+'), ~all(vec %in% .x)))