如何迭代列值以找出 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 语言的功能,而是逻辑。我如何遍历所有元素并找到模式?例如,在我的示例数据框中,a
被 b
选中了 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 日创建
假设您有一个数据框,其中包含为每个 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
被 b
选中了 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 日创建