【问题标题】:Find all uniq combinations in R查找 R 中的所有唯一组合
【发布时间】:2021-08-09 15:03:56
【问题描述】:

我有 uniq 元素的向量。我需要创建这个向量元素的所有唯一组合(2 个和 3 个)。我尝试使用expand.grid() 函数

genes <- c('A', 'B')
expand.grid(genes, genes)

但输出不包含 uniq 元素

  Var1 Var2
1    A    A #not uniq
2    B    A
3    A    B #not uniq because we already have B+A combination
4    B    B #not uniq

所以我的示例中的结果必须只有 1 行 - B AA B。 3 组合同样的问题

> genes = c('A', 'B', 'C')
> expand.grid(genes, genes, genes)
   Var1 Var2 Var3
1     A    A    A #not uniq
2     B    A    A #not uniq
3     C    A    A #not uniq
4     A    B    A #not uniq
5     B    B    A #not uniq
6     C    B    A 
7     A    C    A #not uniq
8     B    C    A #not uniq
9     C    C    A #not uniq
10    A    A    B #not uniq
11    B    A    B #not uniq
12    C    A    B #not uniq
13    A    B    B #not uniq
14    B    B    B #not uniq
15    C    B    B #not uniq
16    A    C    B #not uniq
17    B    C    B #not uniq
18    C    C    B #not uniq
19    A    A    C #not uniq
20    B    A    C #not uniq
21    C    A    C #not uniq
22    A    B    C #not uniq
23    B    B    C #not uniq
24    C    B    C #not uniq
25    A    C    C #not uniq
26    B    C    C #not uniq
27    C    C    C #not uniq

如何获得 2 和 3 的所有唯一组合?

更新 combn() 不起作用

genes = c('A', 'B', 'C')
combn(genes, 2)
     [,1] [,2] [,3]
[1,] "A"  "A"  "B" 
[2,] "B"  "C"  "C" 

如果我有 genes = c('A', 'B', 'C') 想要获取具有三个对组合的数据框

  Var1 Var2
1    A    B
2    A    C
3    B    C

如果我搜索三元组,还有一个包含 1 个三元组组合的数据框:

   Var1 Var2 Var3
1     A    B    C

类似的东西

uniq_pairs = some_function(genes, 2)
uniq_triplets = some_function(genes, 3)

【问题讨论】:

  • 您可能正在寻找combn,即combn(genes, 2)

标签: r combinations


【解决方案1】:

更新

如果你想要一个函数,试试下面

> f <- function(genes, k) data.frame(t(combn(genes, k)))

> f(genes, 2)
  X1 X2
1  A  B
2  A  C
3  B  C

> f(genes, 3)
  X1 X2 X3
1  A  B  C

你的意思是combn

> genes <- c("A", "B", "C")

> unlist(sapply(2:3, function(k) combn(genes, k, paste0, collapse = "+")))
[1] "A+B"   "A+C"   "B+C"   "A+B+C"

【讨论】:

  • @autumnrustle 查看我的更新。这就是你想要的吗?
  • @我更新问题。结果必须按 A+B、A+C、B+C 配对,A+B+C 配对三胞胎
  • 我需要它在数据框中。并分开。像这样的东西 - uniq_pairs = some_function(genes, 2)
  • f
【解决方案2】:

您可以将lapplycombn 一起使用-

genes = c('A', 'B', 'C')

lapply(2:length(genes), function(x) combn(genes, x, paste0, collapse = ' + '))

#[[1]]
#[1] "A + B" "A + C" "B + C"

#[[2]]
#[1] "A + B + C"

如果你想要一个单一的向量作为输出,你可以unlist上面的输出。

【讨论】:

  • 我可以将它放在单独的数据帧中吗?
【解决方案3】:

我不确定:从tidyr 包中尝试crossing

library(tidyr)

crossing(var1='A', var2='B')

crossing(var1='A', var2='B', var3='C')

输出:

crossing(var1='A', var2='B')
# A tibble: 1 x 2
  var1  var2 
  <chr> <chr>
1 A     B    
> crossing(var1='A', var2='B', var3='C')
# A tibble: 1 x 3
  var1  var2  var3 
  <chr> <chr> <chr>
1 A     B     C    

【讨论】:

    【解决方案4】:

    purrr 解决方案可能是

    library(purrr)
    
    genes <- c("A", "B", "C")
    
    data.frame(name = c("uniq_pairs", "uniq_triplets"), n = 2:3) %>% 
      split(., f = .$name) %>% 
      map(~ t(combn(genes, .x$n)))
    

    返回

    $uniq_pairs
         [,1] [,2]
    [1,] "A"  "B" 
    [2,] "A"  "C" 
    [3,] "B"  "C" 
    
    $uniq_triplets
         [,1] [,2] [,3]
    [1,] "A"  "B"  "C" 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-22
      • 2013-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多