r - 在 R 中创建列的唯一组合的 df,其中顺序无关紧要
问题描述
我想创建一个 df ,其中包含三列的所有唯一组合,其中值的顺序无关紧要。在我的示例中,我想创建三个人可能拥有的所有意识形态群体组合的列表。
在我的示例中,“No opinion”、“Moderate”、“Conservative”与“Conservative”、“No opinion”、“Moderate”相同,与“Moderate”、“No opinion”、“Conservative”等相同。所有这些组合都应由一行表示。
我已经看到关于用于主场和客场运动队的类似主题distinct
,但我认为这不适用于这个问题。
library(tidyverse)
political_spectrum_values =
factor(c("Far left",
"Liberal",
"Moderate",
"Conservative",
"Far right",
"No opinion"),
ordered = T)
political_groups_of_3 <-
crossing(first_person = political_spectrum_values,
second_person = political_spectrum_values,
third_person = political_spectrum_values)
我考虑过通过管道进入这条线来制作某种组合变量,但我不确定如何从这里获取它
unite(col = "group_composition", c(first_person, second_person, third_person), sep = "_")
编辑:在处理这个问题更长的时间后,我以一种可能使这更容易的方式重塑了数据
crossing(first_person = political_spectrum_values,
second_person = political_spectrum_values,
third_person = political_spectrum_values) %>%
mutate(group_n = row_number()) %>%
pivot_longer(cols = c(first_person, second_person, third_person),
values_to = "ideology",
names_to = "group") %>%
select(-group)
解决方案
这是您可以使用的技巧。不要从政治倾向的名称开始,而是从数字 5^(0:5) 开始。请注意,任何长度为 3 的组合的总和都是唯一的,因为 3 乘以 5^x 小于 5^(x+1)。因此,如果您在三个这样的向量上运行expand.grid
(等效于crossing
)并获取行总和,那么唯一总和的位置将与crossing
结果中唯一名称组合的位置相同。
所以你可以只做这个单行:
political_groups_of_3[!duplicated(rowSums(expand.grid(5^(0:5), 5^(0:5), 5^(0:5)))), ]
这使:
#> # A tibble: 56 x 3
#> first_person second_person third_person
#> <ord> <ord> <ord>
#> 1 Conservative Conservative Conservative
#> 2 Conservative Conservative Far left
#> 3 Conservative Conservative Far right
#> 4 Conservative Conservative Liberal
#> 5 Conservative Conservative Moderate
#> 6 Conservative Conservative No opinion
#> 7 Conservative Far left Far left
#> 8 Conservative Far left Far right
#> 9 Conservative Far left Liberal
#> 10 Conservative Far left Moderate
#> # ... with 46 more rows
这是否“更优雅”或只是一个不透明的黑客当然是一个品味问题......
推荐阅读
- logging - Fluent bit - TCP 输出插件 - 恒定连接和 JSON 流
- windows - 如何从 Windows 10 上停止的 mysql docker 容器访问 my.cnf 文件?
- sql - SQL - 名称丢失但不是
- assembly - 在 x86 组装中使用 PC 扬声器播放声音
- printing - 读取文件名时Python中的奇怪字符
- django - GKE 上的 Kubernetes Django Restframework
- unit-testing - 为使用 retryWhen 运算符的 RxJS 编写测试(了解与重试运算符的区别)
- linux - 在 RHEL 上找不到 netstat/net-tools 包
- angular - Angular 7 反应式表单下拉选项未更新
- cognos - Cognos:在报表工作室中创建自定义组