【问题标题】:Is there a version of str_detect to find duplicates?是否有用于查找重复项的 str_detect 版本?
【发布时间】:2021-01-24 22:08:54
【问题描述】:

我有一个包含多个包含标识符的列的数据集,我需要根据标识符识别重复项。我创建了一个将所有标识符列粘贴在一起的新列,但我不确定如何实际检测重复项。

当前数据集如下所示:

id <- (1:10)
record <- c("A | B", "A", "--C--", "B", "CD", "D", "ABCD", "B | D | A", "C", "data:D")
df <- data.frame(id, record)
   id      record
   1        A | B
   2            A
   3        --C--
   4            B
   5           CD
   6            D
   7         ABCD
   8    B | D | A
   9            C
 10        data:D

我想根据 A、B、C 和 D 查找重复行。例如,它应该告诉我 5、6、7、8 和 10 有匹配项,因为它们都包含 D。

我更喜欢tidyverse 解决方案,并且一直在玩stringrdplyr,但没有运气。我不想搜索特定模式,而是查找包含彼此相同字符串的所有行。

【问题讨论】:

  • 你能说得更具体些吗?为什么你似乎只在搜索子字符串时提到重复记录grep('D', df$record)
  • 我将来自一堆来源的数据集放在一起,这些来源的标识符分布在不同的列中,大多数记录都有多个标识符。所以数据集太大太复杂,无法寻找像“D”这样的特定实例

标签: r duplicates


【解决方案1】:
id <- (1:10)
record <- c("A | B", "A", "--C--", "B", "CD", "D", "ABCD", "B | D | A", "C", "data:D")
df <- data.frame(id, record)

df$index <- stringr::str_extract_all(df$record, "[A-Z]")

library(dplyr)
library(tidyr)

res = unnest(df) %>% tidyr::spread(index,-id)

> res
# A tibble: 10 x 6
      id record    A     B     C     D    
   <int> <fct>     <chr> <chr> <chr> <chr>
 1     1 A | B     A     B     NA    NA   
 2     2 A         A     NA    NA    NA   
 3     3 --C--     NA    NA    C     NA   
 4     4 B         NA    B     NA    NA   
 5     5 CD        NA    NA    C     D    
 6     6 D         NA    NA    NA    D    
 7     7 ABCD      A     B     C     D    
 8     8 B | D | A A     B     NA    D    
 9     9 C         NA    NA    C     NA   
10    10 data:D    NA    NA    NA    D    

【讨论】:

  • 在实际数据框中,记录列是字符、数字和字符+数字标识符的组合,而不仅仅是我在示例中输入的字母。有没有办法用 str_extract_all 检测那些?例如,如果我想检测数据:记录的 D 值?
  • 您可以使用或逻辑运算符df$index &lt;- stringr::str_extract_all(df$record, "(?:[A-Z]|data:D)")
  • 我不知道我要查找的实际字符串,我只想查看重复项
  • 所以你可能对 stringdist 包中的 stringsim 感兴趣。如果您使用更精确的信息创建新问题,可能会很有价值。尝试更紧密地重现您的日期集。
  • 我的数据集非常大,标识符列表非常长,所以恐怕我可以创建的任何可重现的示例都不会比我提供的更好。谢谢你的建议,我正在研究 stringdist 包
猜你喜欢
  • 2018-09-22
  • 1970-01-01
  • 2021-10-09
  • 1970-01-01
  • 2017-04-20
  • 1970-01-01
  • 2012-02-26
  • 2022-01-23
  • 2018-11-26
相关资源
最近更新 更多