0

假设您有一个数据框,其中包含为每个 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 语言的功能,而是逻辑。如何遍历所有元素并找到模式?例如,在我的示例数据框中a被选中了b3 次。但是原始数据框超过 30k 行,所以我无法手动计算这些组合。我如何自动化这个寻找每个元素的选择数量的过程?

我正在考虑扩大我的df,pivot_wider然后用map_lgl它来查找匹配项。然后我面临的问题是,我需要花费大量时间来找到所有可能的组合,并应用map_lgl每对元素。

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

您有任何想法如何创建一个包含所有 id 值的所有可能组合的数据框吗?

4

2 回答 2

1

我知道这段代码很慢,但这是另一个示例代码,可以根据 package.json 获得预期的输出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 包于 2021-03-04 创建(v1.0.0)

于 2021-03-04T10:30:53.093 回答
0

对于许多 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
#<...>
于 2021-03-04T09:09:57.480 回答