【问题标题】:Excluding certain combinations from combn function in R从 R 中的 combn 函数中排除某些组合
【发布时间】:2017-08-03 10:42:55
【问题描述】:

我试图排除由“var4”和“var5”组成的组合函数生成的所有组合。以下是目前无法使用的代码:

mod_headers <- c("var1", "var2", "var3", "var4", "var5", "var6")

f <- function(){
  for(i in 1:length(mod_headers)){
    tab <- combn(mod_headers,i,function(mod_headers){
      if (combn(mod_headers,i) %in% c("var4","var5")) {return()}
    })
    for(j in 1:ncol(tab)){
      tab_new <- c(tab[,j])
      mod_tab_new <- c(tab_new, "newcol")
      print(mod_tab_new)
    }
  }
}

f()

感谢您的帮助!

【问题讨论】:

  • 任何一个都可以单独出现,只是不想它们一起出现?
  • 是的,确切地说,我不希望它们同时出现。谢谢!

标签: r combn


【解决方案1】:

我不太确定您希望如何格式化您的结果,因此我停止获取排除两个值同时出现的组合。它依赖于 combn 返回一个矩阵,其中每一列都是一个组合。

mod_headers <- c("var1", "var2", "var3", "var4", "var5", "var6")


combn_with_exclusion <- function(x, n, exclude){
  full <- combn(x, n)
  # remove any columns that have all elements of `exclude`
  full[, !apply(full, 2, function(y) all(exclude %in% y))]
}

combn_with_exclusion(mod_headers, 2, c("var4", "var5"))

【讨论】:

  • 谢谢,您的脚本为我提供了所需的结果,但是,我不想更改代码的结构,因为它是更健壮代码的一部分(我刚刚删除了所有这里不需要)。有没有办法将 FUN 直接应用到 combn 函数中?谢谢
  • 我认为 Andrew Gustar 的答案可能是您想要用来代替 f() 的答案。
  • @New2coding combn 函数中的FUN 应用于每个单独的组合,如果它符合您的标准,我想不出办法让它完全省略组合。例如,将 ifelse 替换为 NULL 是行不通的。
  • 好的,感谢您的评论。我试图让这段代码工作,因为它是我其他代码的一部分。我正在尝试做的事情是通过排除相关标头的名称来从 GLModel 中排除相关变量(原始帖子:stackoverflow.com/questions/45466513/…
【解决方案2】:

这是另一种方式,生成所有组合的列表,然后排除同时包含var4var5的组合...

lapply(
   lapply(1:length(mod_headers),
        function(i) combn(mod_headers, i)), 
   function(x) x[,apply(x, 2, function(y) !all(c("var4", "var5") %in% y))]) 

[[1]]
[1] "var1" "var2" "var3" "var4" "var5" "var6"

[[2]]
     [,1]   [,2]   [,3]   [,4]   [,5]   [,6]   [,7]   [,8]   [,9]   [,10]  [,11]  [,12]  [,13]  [,14] 
[1,] "var1" "var1" "var1" "var1" "var1" "var2" "var2" "var2" "var2" "var3" "var3" "var3" "var4" "var5"
[2,] "var2" "var3" "var4" "var5" "var6" "var3" "var4" "var5" "var6" "var4" "var5" "var6" "var6" "var6"

[[3]]
     [,1]   [,2]   [,3]   [,4]   [,5]   [,6]   [,7]   [,8]   [,9]   [,10]  [,11]  [,12]  [,13]  [,14]  [,15]  [,16] 
[1,] "var1" "var1" "var1" "var1" "var1" "var1" "var1" "var1" "var1" "var2" "var2" "var2" "var2" "var2" "var3" "var3"
[2,] "var2" "var2" "var2" "var2" "var3" "var3" "var3" "var4" "var5" "var3" "var3" "var3" "var4" "var5" "var4" "var5"
[3,] "var3" "var4" "var5" "var6" "var4" "var5" "var6" "var6" "var6" "var4" "var5" "var6" "var6" "var6" "var6" "var6"

...etc

【讨论】:

    【解决方案3】:

    我只在 TIO 上尝试过,所以没有进行基准测试,但我敢打赌,如果这很重要的话,这个版本对于大型系列来说会更快。

    m <- c("var2", "var3", "var4", "var5", "var6")
    comb <- combn(m, 3)
    csums <- colSums((comb == "var4") + (comb == "var5"))
    comb[, csums < 2]
    #      [,1]   [,2]   [,3]   [,4]   [,5]   [,6]   [,7]  
    # [1,] "var2" "var2" "var2" "var2" "var2" "var3" "var3"
    # [2,] "var3" "var3" "var3" "var4" "var5" "var4" "var5"
    # [3,] "var4" "var5" "var6" "var6" "var6" "var6" "var6"
    

    或者相当于OP的f():

    f2 <- function(m=mod_headers) {
        lapply(1:length(m), function(x) {
          comb <- combn(m, x)
          csums <- colSums((comb == "var4") + (comb == "var5"))
          comb[, csums < 2]
        })
    }
    

    【讨论】:

    • 这是我的解决方案:f
    【解决方案4】:

    这是我的解决方案:

    f <- function(){
      for(i in 1:length(mod_headers)){
          tab <- combn(mod_headers,i)
          for(j in 1:ncol(tab)){
            tab_new <- c(tab[,j])
            mod_tab_new <- c(tab_new, "newcol")
            if (all(c("var4","var5") %in% mod_tab_new)) next
            print(mod_tab_new)
        }
      }
    }
    
    f()
    

    【讨论】:

      【解决方案5】:

      在给定另一组 N-Way 组合的情况下,我使用此网页来减少 N-Way 组合列表。这是对 Benjamins Code 的轻微修改。

      mod_headers <- c("var1", "var2", "var3", "var4", "var5", "var6")
      
      combn_NWayExclusion <- function(x, n, exclude){
         full <- combn(x, n); EXC<-combn(exclude, n)
         UU<-lapply(1:ncol(EXC),function(i) !apply(full, 2, function(y) all(EXC[,i] %in% y)))
         full[,!apply(do.call(rbind,UU),2,function(u){any(u=="FALSE")})]
         }
      
      combn_NWayExclusion(mod_headers, 2, c("var4", "var5"))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-05
        • 1970-01-01
        • 2020-07-25
        相关资源
        最近更新 更多