【问题标题】:How can I obtain the distinct values for a "|" delimited column? [duplicate]如何获得“|”的不同值分隔列? [复制]
【发布时间】:2021-08-15 09:49:30
【问题描述】:

我有一个如下所示的数据框:

+--+---------------------------+
|id|grids                      |
+--+---------------------------+
|c1|21257a|75589y|21257a|77589y|
|c2|21257a|21257a|21257a|21257a|
|c3|21257a|75589y|75589y|33421v|

但是,由于网格列下有重复的字符,我想只提取不同的字符,使数据框变成这样:

+--+---------------------------+
|id|grids                      |
+--+---------------------------+
|c1|21257a|75589y              |
|c2|21257a                     |
|c3|21257a|75589y|33421v       |

任何帮助将不胜感激!

【问题讨论】:

    标签: r


    【解决方案1】:

    使用sapply 拆分| 上的字符串,每行仅保留unique 值并粘贴。

    df$grids <- sapply(strsplit(df$grids, '|', fixed = TRUE), function(x) 
                       paste0(unique(x), collapse = '|'))
    

    【讨论】:

      【解决方案2】:

      这是一个基于 R 正则表达式的基础方法:

      df$grids <- gsub("\\b(.+?)(?=\\|.*\\1)", "", df$grids, perl=TRUE)
      df$grids <- gsub("^\\|+|\\|+$", "", df$grids)
      df$grids <- gsub("\\|{2,}", "|", df$grids)
      df
      
        id                grids
      1 c1        21257a|75589y
      2 c2               21257a
      3 c3 21257a|75589y|33421v
      

      数据:

      df <- data.frame(id=c("c1", "c2", "c3"),
                       grids=c("21257a|75589y|21257a|75589y",
                               "21257a|21257a|21257a|21257a",
                               "21257a|75589y|75589y|33421v"))
      

      对于正则表达式\b(.+?)(?=\|.*\1) 的解释,它匹配任何管道分隔的术语,我们可以在网格字符串中找到相同的术语稍后。如果是这样,那么我们通过替换为空字符串来剥离它。还有一些清理步骤可以移除可能留下的(或在网格字符串的开头/结尾处)悬空的多个管道。

      【讨论】:

        【解决方案3】:

        使用@Tim 的data

        library(tidyverse)
        df <- data.frame(id=c("c1", "c2", "c3"),
                         grids=c("21257a|75589y|21257a|75589y",
                                 "21257a|21257a|21257a|21257a",
                                 "21257a|75589y|75589y|33421v"))
        df %>% mutate(grids = map_chr(str_split(grids, '\\|'), 
                                      ~paste(unique(.x), collapse = '|')))
        #>   id                  grids
        #> 1 c1          21257a|75589y
        #> 2 c2                 21257a
        #> 3 c3   21257a|75589y|33421v
        

        reprex package (v2.0.0) 于 2021 年 5 月 27 日创建

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-01-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-19
          • 2021-11-10
          • 2019-12-01
          相关资源
          最近更新 更多