首页 > 解决方案 > 在 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)

标签: rcombinationstidyverse

解决方案


这是您可以使用的技巧。不要从政治倾向的名称开始,而是从数字 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

这是否“更优雅”或只是一个不透明的黑客当然是一个品味问题......


推荐阅读