【问题标题】:Identify repeatd characters across columns in r识别 r 中跨列的重复字符
【发布时间】:2021-12-24 02:26:13
【问题描述】:

在 RStudio 中,我有一个跨列中不同组的不同字符串的 df。每列大约有 600 个,我不确定某些字符是在所有列/组中重复还是仅在 2 或 3 列中重复。我想知道是否有一种方法可以在每列中仅使用重复字符以及它们在哪些列/组中重复来制作新的 df。

例如我的 df 看起来像这样

Group1 Group2 Group3 Group4 Group5
AB      FG    SA     KD      CD
CD      ZX    AB     ER      ZX 
ED      QW    OI     SA      AB
GD      AS    ZX     QW      KD 

我不确定最终的 df 会是什么样子;但我希望能够识别哪些字符在哪些组中重复,然后制作一个图形来显示该信息。我希望这是有道理的。或者我怎样才能找出哪些字符在两列中重复,然后在四列中重复三个,或者在所有 5 列中重复。谢谢。

【问题讨论】:

    标签: r multiple-columns repeat large-data identify


    【解决方案1】:
    library(tidyverse)
    
    data <- tribble(
      ~Group1, ~Group2, ~Group3, ~Group4, ~Group5,
      "AB", "FG", "SA", "KD", "CD",
      "CD", "ZX", "AB", "ER", "ZX",
      "ED", "QW", "OI", "SA", "AB",
      "GD", "AS", "ZX", "QW", "KD"
    )
    
    
    repeated_values <-
      data %>%
      pivot_longer(everything()) %>%
      group_by(value) %>%
      count() %>%
      filter(n >= 2) %>%
      pull(value)
    repeated_values
    #> [1] "AB" "CD" "KD" "QW" "SA" "ZX"
    
    # in which rows are which repeated characters?
    repeated_data <-
      data %>%
      mutate(row_id = row_number()) %>%
      pivot_longer(-row_id) %>%
      filter(value %in% repeated_values)
    repeated_data
    #> # A tibble: 14 x 3
    #>    row_id name   value
    #>     <int> <chr>  <chr>
    #>  1      1 Group1 AB   
    #>  2      1 Group3 SA   
    #>  3      1 Group4 KD   
    #>  4      1 Group5 CD   
    #>  5      2 Group1 CD   
    #>  6      2 Group2 ZX   
    #>  7      2 Group3 AB   
    #>  8      2 Group5 ZX   
    #>  9      3 Group2 QW   
    #> 10      3 Group4 SA   
    #> 11      3 Group5 AB   
    #> 12      4 Group3 ZX   
    #> 13      4 Group4 QW   
    #> 14      4 Group5 KD
    
    # in how many rows are the repeated characters?
    repeated_data %>%
      distinct(row_id, value) %>%
      count(value)
    #> # A tibble: 6 x 2
    #>   value     n
    #>   <chr> <int>
    #> 1 AB        3
    #> 2 CD        2
    #> 3 KD        2
    #> 4 QW        2
    #> 5 SA        2
    #> 6 ZX        2
    

    reprex package (v2.0.1) 于 2021 年 11 月 11 日创建

    【讨论】:

      【解决方案2】:

      以下是如何打印组的示例:

      数据:

      dat <- structure(list(Group1 = c("AB", "CD", "ED", "GD"), Group2 = c("FG", 
      "ZX", "QW", "AS"), Group3 = c("SA", "AB", "OI", "ZX"), Group4 = c("KD", 
      "ER", "SA", "QW"), Group5 = c("CD", "ZX", "AB", "KD")), class = "data.frame", row.names = c(NA, 
      -4L))
      
      dat
        Group1 Group2 Group3 Group4 Group5
      1     AB     FG     SA     KD     CD
      2     CD     ZX     AB     ER     ZX
      3     ED     QW     OI     SA     AB
      4     GD     AS     ZX     QW     KD
      
      • 获取重复次数:
      ta <- table(as.matrix(dat))
      
      # all character strings
      ta
      AB AS CD ED ER FG GD KD OI QW SA ZX 
       3  1  2  1  1  1  1  2  1  2  2  3 
      
      # only repeated
      ta[ta > 1]
      AB CD KD QW SA ZX 
       3  2  2  2  2  3 
      
      • 填充字符向量列表以获取组:
      sapply( names(table(as.matrix(dat))[table(as.matrix(dat)) > 1]),
        function(x) colnames(dat[grep(paste0("\\b",x,"\\b"), dat)]) )
      $AB
      [1] "Group1" "Group3" "Group5"
      $CD
      [1] "Group1" "Group5"
      $KD
      [1] "Group4" "Group5"
      $QW
      [1] "Group2" "Group4"
      $SA
      [1] "Group3" "Group4"
      $ZX
      [1] "Group2" "Group3" "Group5"
      
      • 显示所有字符串,也显示只匹配一次的字符串:
      sapply( names(table(as.matrix(dat))),
        function(x) colnames(dat[grep(paste0("\\b",x,"\\b"), dat)]) )
      $AB
      [1] "Group1" "Group3" "Group5"
      $AS
      [1] "Group2"
      $CD
      [1] "Group1" "Group5"
      $ED
      [1] "Group1"
      $ER
      [1] "Group4"
      $FG
      [1] "Group2"
      $GD
      [1] "Group1"
      $KD
      [1] "Group4" "Group5"
      $OI
      [1] "Group3"
      $QW
      [1] "Group2" "Group4"
      $SA
      [1] "Group3" "Group4"
      $ZX
      [1] "Group2" "Group3" "Group5"
      
      • 如果您愿意,还可以添加匹配的列:
      sapply( names(table(as.matrix(dat))[table(as.matrix(dat)) > 1]),
        function(x) dat[grep(paste0("\\b",x,"\\b"), dat)] )
      $AB
        Group1 Group3 Group5
      1     AB     SA     CD
      2     CD     AB     ZX
      3     ED     OI     AB
      4     GD     ZX     KD
      ... etc
      

      【讨论】:

      • 每列大约有 600 个字符。如何制作带有逗号和引号的列列表以包含在“dat
      • 希望我的问题是正确的,但您可以简单地将您的 data.frame 命名为 dat 并且示例应该按照列出的方式工作。 Data 部分仅用于我的示例。
      • 你好。当尝试填充字符向量列表以获取组时,它实际上并不特定于字符。例如,在手动检查我的数据集后,代码输出在查找“AB”时包含“ABC”,因为后者在前者中,并且说它在 ABC 所在的组中,而不是特定于只有AB。那有意义吗?有没有办法解决这个问题?
      • 好收获!我添加了单词边界来解决这个问题!现在应该可以工作了!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      相关资源
      最近更新 更多