如何从stringr中的字符串中排除值

如何从stringr中的字符串中排除值,r,stringr,R,Stringr,我正在使用str_detect替换数据帧中的一些字符串。但是,由于字符串是一个组,其顺序有时会发生变化,因此我很难将这些值组合在一起,而忽略了一些值 我的列表如下所示: c("TONY_B+CAT_A", "TONY_B+JOHN_C+CAT_A") 我想用“蓝色”来代替TONY_B和CAT_A的任何组合 托尼·B、约翰·C、猫·A和“红色”的任意组合 我尝试过替换(数据,str_detect(数据,“^TONY_B+CAT_A$”,“蓝色”) 但这显然只按顺序起作用(例如,它忽略了CAT_A

我正在使用str_detect替换数据帧中的一些字符串。但是,由于字符串是一个组,其顺序有时会发生变化,因此我很难将这些值组合在一起,而忽略了一些值

我的列表如下所示:

c("TONY_B+CAT_A", "TONY_B+JOHN_C+CAT_A")
我想用“蓝色”来代替TONY_B和CAT_A的任何组合

托尼·B、约翰·C、猫·A和“红色”的任意组合

我尝试过替换(数据,str_detect(数据,“^TONY_B+CAT_A$”,“蓝色”)

但这显然只按顺序起作用(例如,它忽略了CAT_A+TONY_B)

我试着用管道把它们连在一起,但后来我也拿起了约翰C的绳子

我尝试过使用“?!”负面环视,但这似乎也失败了

我不想硬编码所有的组合,但它们可能会很长,而且似乎一定有更好的方法


有人知道我如何解决这个问题吗?

我认为“蓝色”和“红色”的条件更多地是关于逻辑,而不是关于文本模式。依我看,这意味着您最好在R代码中处理它们,而不是在正则表达式中。也许可以用一个大而复杂的正则表达式来表达这种逻辑,但我认为用R代码来表达更简单:

x = c("TONY_B+CAT_A", "TONY_B+JOHN_C+CAT_A")
has_tony = str_detect(x, "TONY_B")
has_cat = str_detect(x, "CAT_A")
has_john = str_detect(x, "JOHN_C")
# NOTE: the order of these replacements is important,
#   since "RED" is a subset of "BLUE"
x[has_tony & has_cat] = "BLUE"
x[has_tony & has_cat & has_john] = "RED"

对于“蓝色”,是否“托尼B”和“猫A”必须出现在彼此旁边(中间没有任何内容)?或者它只是有“约翰C”使它变成“红色”?托尼B和猫A必须在那里,以及约翰C使它变成红色。我在管道连接和排除某些值时遇到了问题。
如果其他(str_detect(c(“TONY_B+CAT_A”、“TONY_B+JOHN_c+CAT_A”)、“JOHN_c”)、“RED”、“BLUE”)
?@paqmo:可能在实际数据中有其他字符串缺少“TONY_B”或“CAT_A”@Marius目前还不清楚……但可能是这样。要是这么简单就好了。