如何从一列中的另一列中搜索和提取唯一值?

How to search for and extract unique values from one column in another column?

我的任务是检查多个不同列中的值是否出现在包含项目名称的字段中的字符串中。如果这些值出现在这个项目名称列中,则需要将它们提取出来并放在一个新列中。我需要一次搜索一列,所以它看起来像这样: 在 A 列中,搜索 B 列中的唯一值。我需要多次执行此操作,其中 A 列始终相同,但 B 列中的一组唯一值将不同,因为我正在使用B 列中的唯一值。 下面是一些示例数据:

Col_A <- c("blue shovel 1024", "red shovel 1022", "green bucket 3021",
           "green rake 3021", "yellow shovel 1023")
Col_B <- c("blue", "red", "green", "blue", "yellow")

df <- data.frame(Col_A, Col_B)
print(df)
               Col_A  Col_B  Col_C (output column)
1   blue shovel 1024   blue  blue
2    red shovel 1022    red  red
3  green bucket 3021  green  green
4    green rake 3021   blue  green
5 yellow shovel 1023 yellow  yellow

在上述情况下,我想从 Col_B 和 Col_A 中搜索唯一值,然后如果找到任何值,将它们放在新列中 (Col_C) .如果它没有找到一个值,或者该值不是预期的值(即第 4 行),那没关系。我只是想弄清楚如何实现这一目标。

我试过使用 mutate 和 str_extract 如下:

mutate(New_Col = str_extract(Col_A, unique_Col_B_vals))

但我真的没有运气。有时它 return 是我期望的值,而其他时候它 return 是一个没有意义的值。作为参考,上面的“unique_Col_B_vals”是一个数据框。想知道这是否是问题的一部分?

我对这种方法并没有死心塌地,所以如果有更好的方法从一列搜索另一列的一组唯一值,我会洗耳恭听。谢谢!

*编辑

我正在使用的数据集在一致性方面存在很多问题。 Col_A 中的值在数据集中要长得多,并且 应该 由来自多个字段的不同值组成(基本上就像一个连接),但我们知道这不会发生在许多情况下是正确的。因此,我从各个字段(例如 Col_B)中获取唯一值,并查看这些唯一值中是否有一个出现在 Col_A 中。如果是这样,我想提取它并将其带到一个新列 (Col_C),以便我可以比较 Col_B 中的内容与从 Col_A.[=13 中提取的内容=]

同样为了清楚起见,我想要发生的是对于 Col_A 中的每个值,搜索 Col_B 中的所有唯一值并将找到的任何内容提取到 Col_C .

我也尝试了以下方法,但出现错误:

uniquevals <- list(unique(df$Col_B))

df <- df %>% 
  mutate(Col_C = str_extract(Col_A, uniquevals))

Error: Problem with `mutate()` column `Col_C`.
i `Col_C = str_extract(Col_A, uniquevals)`.
x no applicable method for 'type' applied to an object of class "list"

我认为这对你有用:

mutate(df, Col_C = stringr::str_extract(
  Col_A,
  paste0("\b(", paste0(unique(Col_B), collapse = "|"), ")\b")))
#                Col_A  Col_B  Col_C
# 1   blue shovel 1024   blue   blue
# 2    red shovel 1022    red    red
# 3  green bucket 3021  green  green
# 4    green rake 3021   blue  green
# 5 yellow shovel 1023 yellow yellow

细分:

  • paste0(unique(Col_B), collapse="|") 获取 Col_B 中的单词,对其进行去重,并将它们与 | 符号连接在一起;即 c("blue","red","green") --> "blue|red|green"。在正则表达式中,| 符号是一个“或”运算符。
  • \b()\b 是单词边界,这意味着在模式之前(第一个)或之后(第二个)没有类似单词的字符;通过在单词周围添加这个,我们可以防止 blublue 上的部分匹配(以防万一);虽然这并没有明显改变这里的任何内容,但它是一种更 defensive/specific 的模式。 parens 添加分组,在下一个项目符号中更加明显。
  • 综上所述,我们的整体模式看起来像 "\b(blue|red|green)\b"(缩写)。这转化为 "find blue or red or green 这样在你找到的任何一个的两端都有一个单词边界".