如何迭代列值以找出 R 中所有可能的组合?

How to iterate column values to find out all possible combinations in R?

假设您有一个数据框,其中包含为每个 ID 规定的 ID 和元素。例如:

example <- data.frame(id = c(1,1,1,1,1,2,2,2,3,4,4,4,4,4,4,4,5,5,5,5),
                      vals = c("a","b",'c','d','e','a','b','d','c',
                                 'd','f','g','h','a','k','l','m', 'a',
                                 'b', 'c'))

我想找到所有可能的配对组合。这里的主要斗争不是我可以使用的 R 语言的功能,而是逻辑。我如何遍历所有元素并找到模式?例如,在我的示例数据框中,ab 选中了 3 次。但是原始数据框超过 30k 行,所以我无法手动计算这些组合。如何自动执行查找每个元素的拾取次数的过程?

我正在考虑使用 pivot_wider 扩大我的 df,然后使用 map_lgl 来查找匹配项。然后我遇到了一个问题,我需要花费很多时间来找到所有可能的组合,对每一对元素应用 map_lgl

不到一个月前,我问的几乎一样,其他用户回答了,但结果不是我真正需要的。

您是否知道如何使用所有 ID 的所有可能值组合创建数据框?

对于许多 ID,这不会(不能)很快。如果太慢,则需要并行化或用编译型语言实现(如使用Rcpp)。

我们排序vals。然后我们可以创建按 ID 分组的两个项目的所有组合。我们排除了 1 项的 ID。最后我们将结果制成表格。

library(data.table)
setDT(example)
setorder(example, id, vals)
example[, if (.N > 1) split(combn(vals, 2), 1:2), by = id][, .N, by = c("1", "2")]
#    1 2 N
# 1: a b 3
# 2: a c 2
# 3: a d 3
# 4: a e 1
# 5: b c 2
# 6: b d 2
# 7: b e 1
#<...>

我知道这段代码很慢,但这里是另一个示例代码,用于根据 tidyverse 包获得预期的输出。
我在这里所做的是首先通过 id 创建一个嵌套数据框,然后为每个 id 生成所有对组合,取消嵌套数据框,最后计算对数。

library(tidyverse)
example <- data.frame(
  id = c(1,1,1,1,1,2,2,2,3,4,4,4,4,4,4,4,5,5,5,5),
  vals = c("a","b",'c','d','e','a','b','d','c','d','f','g','h','a','k','l','m','a','b', 'c')
)
example %>% nest(dataset=-id) %>% mutate(dataset=map(dataset, function(dataset){
  if(nrow(dataset)>1){
    dataset %>% .$vals %>% combn(., 2) %>% t() %>% as_tibble(.name_repair=~c("val1", "val2")) %>% return()
  }else{
    return(NULL)
  }
})) %>% unnest(cols=dataset) %>% group_by(val1, val2) %>% summarize(n=n(), .groups="drop") %>% arrange(desc(n), val1, val2)
#> # A tibble: 34 x 3
#>    val1  val2      n
#>    <chr> <chr> <int>
#>  1 a     b         3
#>  2 a     c         2
#>  3 a     d         2
#>  4 b     c         2
#>  5 b     d         2
#>  6 a     e         1
#>  7 a     k         1
#>  8 a     l         1
#>  9 b     e         1
#> 10 c     d         1
#> # … with 24 more rows

reprex package (v1.0.0)

于 2021 年 3 月 4 日创建