【发布时间】:2019-12-26 04:33:28
【问题描述】:
我有一个具有这种结构的数据集:
df
#> Instance Alice_prefers Bob_prefers Charlie_prefers
#> 1 1 Bob Charlie Alice
#> 2 2 Bob Alice Bob
#> 3 3 Bob Charlie Bob
我想要的输出是一个数据框,其中:
- 数据帧的每一行都是 Alice、Bob 和 Charlie 可能偏好的一种组合
- 数据帧包含所有可能的组合,即数据帧中的行数等于可能的组合数。
-
在任何给定的组合(即行)中,一个人偏爱另一个人,他们不能偏爱自己,即爱丽丝可以选择偏爱鲍勃或查理,但不能偏爱爱丽丝,也不能偏爱鲍勃和 em> 查理在同一个例子中。
因此,完整的期望输出是:
#> instance alice_prefers bob_prefers charlie_prefers
#> 1 1 Bob Alice Alice
#> 2 2 Bob Alice Bob
#> 3 3 Bob Charlie Alice
#> 4 4 Bob Charlie Bob
#> 5 5 Charlie Alice Alice
#> 6 6 Charlie Alice Bob
#> 7 7 Charlie Charlie Alice
#> 8 8 Charlie Charlie Bob
我当前的解决方案有效(代码如下),但看起来非常笨拙,而且显然不能推广到更多人,而不仅仅是 Alice、Bob 和 Charlie (k = 3)。我正在使用嵌套循环。
我有两个问题:
必须有一种更简单的方法来生成此输出,可以使用
purrr或igraph或其他方式——有更好的方法吗?我之前没用过igraph。目前,问题针对 3 个人
(k = 3):Alice、Bob、Charlie。有没有什么方法可以很容易地概括解决方案来增加更多的人,所以如果我想生成 Alice、Bob、Charlie、Don 和 Enid 的组合,我可以调用一个函数,传递k = 5作为论据?人名可以是任何名称,我只是将他们设置为按照字母表来帮助我处理这个问题。
choices_alice <- c("Bob", "Charlie")
choices_bob <- c("Alice", "Charlie")
choices_charlie <- c("Alice", "Bob")
get_combinations <- function(choices_alice, choices_bob, choices_charlie) {
instance <- numeric()
alice_prefers <- character()
bob_prefers <- character()
charlie_prefers <- character()
id <- 1
for (a_counter in seq_along(choices_alice)) {
for (b_counter in seq_along(choices_bob)){
for (c_counter in seq_along(choices_charlie)){
alice_prefers[id] <- choices_alice[a_counter]
bob_prefers[id] <- choices_bob[b_counter]
charlie_prefers[id] <- choices_charlie[c_counter]
instance[id] <- id
id <- id + 1
}
}
}
data.frame(instance, alice_prefers, bob_prefers, charlie_prefers, stringsAsFactors=FALSE)
}
df <- get_combinations(choices_alice, choices_bob, choices_charlie)
df
【问题讨论】:
-
您需要
expand.grid(choices_alice, choices_bob, choices_charlie)吗?