【问题标题】:Split column by separator and delete values contained in other values按分隔符拆分列并删除其他值中包含的值
【发布时间】:2021-07-26 14:22:03
【问题描述】:

我有一个用“;”分隔的类别列。 IE值:

value <- "A > B > C; A > B > D; A > B > C > C1"

意思是:

当前产品属于“A > B > C”类别,属于“A > B > D”类别和“A > B > C > C1”类别

如果一个类别已包含在另一个类别中,则应将其删除。所以目标是:

expectedResult <- "A > B > D; A > B > C > C1"

因为“A > B > C > C1”包含“A > B > C”。

我该如何解决这个问题?

注意:我知道有数百个问题看起来很相似。但我就是找不到解决办法。

【问题讨论】:

    标签: r set-operations


    【解决方案1】:

    这应该可以工作:

    
    value <- "A > B > C; A > B > D; A > B > C > C1"
    els <- strsplit( value, "; " )[[1]]
    
    my_reducer  <- function(a,b) {
        v <- str_detect( b, fixed(a) )
        a <- a[!v]
        append(a,b)
    }
    
    paste( Reduce( my_reducer, els ), collapse="; " )
    
    

    输出:

    
    > Reduce( my_reducer, els )
    [1] "A > B > D; A > B > C > C1"
    
    

    【讨论】:

    • 我喜欢使用 Reduce 的方式。如果类别有前缀(id),我将如何调整它应该被忽略,但它存在于结果中?例如:值 A> B> C; c090601221> A> B> D; c090501222> A> B> C> C1" 结果 = "c090601221> A> B> D; c090501222> A> B> C> C1"
    • 我相信我明白了:my_reducer
    【解决方案2】:

    或许你可以试试下面的代码

    v <- unlist(strsplit(value, ";\\s+"))
    idx <- colSums(`diag<-`(sapply(v, function(x) {
      p <- gsub(x, "", v, fix = TRUE)
      p != v & nchar(p) > 0
    }), FALSE)) == 0
    paste0(names(idx)[idx], collapse = "; ")
    

    给了

    [1] "A > B > D; A > B > C > C1"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      • 1970-01-01
      相关资源
      最近更新 更多