选择最频繁的组合,同时删除该组合 R 的部分
Selecting most frequent combinations while removing the parts of that combination R
我有一个包含组合及其频率的数据集,如下例所示。这个想法是找到所有组合(必须使用每个名称)以具有最高可能的计数值(频率)。
第 1 个人
第 2 个人
计数
一个
B
4
一个
D
4
一个
C
3
B
C
2
C
D
1
B
D
0
A、B、C、D是人名,count是两个人组合出现的频率。
在此示例中,可以通过 AD 和 BC 组合达到最高计数,其总和为 6 (4+2)。如果我们将 AB 和 CD 作为组合,则计数的总和将更低 (5, 4+1)。
我想要一个看起来像这样的数据集作为答案:
第 1 个人
第 2 个人
计数
一个
D
4
B
C
2
我如何从原始数据集创建这个数据集而没有重复的名称并且具有尽可能高的数量。所以如果有AD组合,就不能再有A或D的组合了。
我尝试了以下代码,但这并没有给我所需的数据集:
dat <- data %>%
arrange(desc(count))
count = 0
while (nrow(dat)>0){
print(dat[1,])
dat <- dat %>%
filter(!(X1==X1[1]|X1==X2[1]|X2==X1[1]|X2==X2[1]))
}
dat是第一个table中所示的排列数据集。我打印具有最高计数的第一行并删除所有组合中包含其中一个名称的组合(因为我只能使用一个名称一次)。如此循环,直到没有更多人离开。
此代码将给出以下数据集:
第 1 个人
第 2 个人
计数
一个
B
4
C
D
1
提前致谢。
igraph
可能有更优雅的解决方案,但这是我的方法:
使用您的数据
your_data <- tibble::tribble( ~Person.1, ~Person.2, ~Count, "A", "B", 4L, "A", "D", 4L, "A", "C", 3L, "B", "C", 2L, "C", "D", 1L, "B", "D", 0L)
和假设Person.1
和Person.2
是按字母顺序排列的,你可以
library(purrr)
with(your_data, unique(c(Person.1, Person.2))) %>%
combinat::permn(\(x) split(x, (seq_along(x) + 1) %/% 2) %>%
map(sort) %>%
map_dfr(set_names, c("Person.1", "Person.2"))) %>%
map(~ arrange(.x, Person.1)) %>%
unique() %>%
imap(~ dplyr::left_join(.x, your_data)) %>%
rlist::list.sort((sum(Count))) %>%
first()
返回所需的
# A tibble: 2 x 3
Person.1 Person.2 Count
<chr> <chr> <int>
1 A D 4
2 B C 2
我有一个包含组合及其频率的数据集,如下例所示。这个想法是找到所有组合(必须使用每个名称)以具有最高可能的计数值(频率)。
第 1 个人 | 第 2 个人 | 计数 |
---|---|---|
一个 | B | 4 |
一个 | D | 4 |
一个 | C | 3 |
B | C | 2 |
C | D | 1 |
B | D | 0 |
A、B、C、D是人名,count是两个人组合出现的频率。 在此示例中,可以通过 AD 和 BC 组合达到最高计数,其总和为 6 (4+2)。如果我们将 AB 和 CD 作为组合,则计数的总和将更低 (5, 4+1)。
我想要一个看起来像这样的数据集作为答案:
第 1 个人 | 第 2 个人 | 计数 |
---|---|---|
一个 | D | 4 |
B | C | 2 |
我如何从原始数据集创建这个数据集而没有重复的名称并且具有尽可能高的数量。所以如果有AD组合,就不能再有A或D的组合了。
我尝试了以下代码,但这并没有给我所需的数据集:
dat <- data %>%
arrange(desc(count))
count = 0
while (nrow(dat)>0){
print(dat[1,])
dat <- dat %>%
filter(!(X1==X1[1]|X1==X2[1]|X2==X1[1]|X2==X2[1]))
}
dat是第一个table中所示的排列数据集。我打印具有最高计数的第一行并删除所有组合中包含其中一个名称的组合(因为我只能使用一个名称一次)。如此循环,直到没有更多人离开。
此代码将给出以下数据集:
第 1 个人 | 第 2 个人 | 计数 |
---|---|---|
一个 | B | 4 |
C | D | 1 |
提前致谢。
igraph
可能有更优雅的解决方案,但这是我的方法:
使用您的数据
your_data <- tibble::tribble( ~Person.1, ~Person.2, ~Count, "A", "B", 4L, "A", "D", 4L, "A", "C", 3L, "B", "C", 2L, "C", "D", 1L, "B", "D", 0L)
和假设Person.1
和Person.2
是按字母顺序排列的,你可以
library(purrr)
with(your_data, unique(c(Person.1, Person.2))) %>%
combinat::permn(\(x) split(x, (seq_along(x) + 1) %/% 2) %>%
map(sort) %>%
map_dfr(set_names, c("Person.1", "Person.2"))) %>%
map(~ arrange(.x, Person.1)) %>%
unique() %>%
imap(~ dplyr::left_join(.x, your_data)) %>%
rlist::list.sort((sum(Count))) %>%
first()
返回所需的
# A tibble: 2 x 3
Person.1 Person.2 Count
<chr> <chr> <int>
1 A D 4
2 B C 2