代码之家  ›  专栏  ›  技术社区  ›  SlyGrogger

来自字符串的组合

  •  1
  • SlyGrogger  · 技术社区  · 6 年前

    inputdata <- c("A1", "A2", "A3", "B1", "B2", "B3", "C1", "C2", "C3")
    

    输出如下所示:

      outputdata <- c("A1 + B1 + C1", "A2 + B1 + C1","A3 + B1 + C1", "A1 + B2 + C1", "A1 + B3 + C1", "A1 + B1 + C2", "A1 + B1 + C3", "A2 + B2 + C1", "A2 + B2 + C2", "A3 + B2 + C2", "A3 + B3 + C2", "A3 + B3 + C3")
    

    我已经掌握了这段代码的大部分方法:

      library(gtools)
      dataformodel <- data.frame(combinations(9,3,inputdata))
      dataformodel$x <- apply( dataformodel[, ] , 1 , paste , collapse = "+" )
      dataformodel <- dataformodel[, -c(1:3)]
    

    这里的问题是相同的字母重复。 "A1 + A2 + B1" -我的想法是数一数每个字符串中的唯一字母,并删除其中的count<3…但没有任何运气(使用毒刺包)。有什么建议吗?

    2 回复  |  直到 6 年前
        1
  •  3
  •   r2evans    6 年前
    split(inputdata, substr(inputdata,1,1))
    # $A
    # [1] "A1" "A2" "A3"
    # $B
    # [1] "B1" "B2" "B3"
    # $C
    # [1] "C1" "C2" "C3"
    

    如果我们打电话 expand.grid 在这方面,我们可以,它会给我们每个组合 A , B ,和 C :

    head( do.call(expand.grid, split(x, substr(x,1,1))) )
    #    A  B  C
    # 1 A1 B1 C1
    # 2 A2 B1 C1
    # 3 A3 B1 C1
    # 4 A1 B2 C1
    # 5 A2 B2 C1
    # 6 A3 B2 C1
    

    现在我们可以 paste(..., collapse="+") 这是:

    apply(do.call(expand.grid, split(x, substr(x,1,1))), 1, paste, collapse="+")
    #  [1] "A1+B1+C1" "A2+B1+C1" "A3+B1+C1" "A1+B2+C1" "A2+B2+C1" "A3+B2+C1"
    #  [7] "A1+B3+C1" "A2+B3+C1" "A3+B3+C1" "A1+B1+C2" "A2+B1+C2" "A3+B1+C2"
    # [13] "A1+B2+C2" "A2+B2+C2" "A3+B2+C2" "A1+B3+C2" "A2+B3+C2" "A3+B3+C2"
    # [19] "A1+B1+C3" "A2+B1+C3" "A3+B1+C3" "A1+B2+C3" "A2+B2+C3" "A3+B2+C3"
    # [25] "A1+B3+C3" "A2+B3+C3" "A3+B3+C3"
    

    • 如果你的数据很大 展开.grid 可能会耗尽内存;
    • 这是我认为 apply data.frame 是安全合理的,因为我们知道它的所有输入都是同一类的
        2
  •  3
  •   akrun    6 年前

    “dataformodel”可以是 filter

    dataformodel <- dataformodel[!apply(sapply(dataformodel, 
          sub, pattern = "\\d+", replacement = ""), 1, anyDuplicated),]
    

    head(dataformodel)
    #[1] "A1+B1+C1" "A1+B1+C2" "A1+B1+C3" "A1+B2+C1" "A1+B2+C2" "A1+B2+C3"
    

    一个更快的方法是使用 RcppAlgos

    library(RcppAlgos)
    dataformodel <-  comboGeneral(inputdata, m = 3, repetition = FALSE)