如何在 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 pets 或 dogsareanimals 和 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)))
我正在寻找与包含字符串的 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 pets 或 dogsareanimals 和 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)))