tidyverse中所有可能的对

问题描述 投票:0回答:1

我想在一个数据帧的行之间创建所有可能的对,而没有重复(即A_B与B_A相同。]

在tidyverse中是否有一种优雅的方法来做到这一点?

示例数据:

df <- tibble(
  id   = 1:5,
  name = c( 'Alice', 'Bob', 'Charlie', 'Diane', 'Fred' )
)

预期输出:

> df_pairs
# A tibble: 10 x 2
   id    name         
   <chr> <chr>        
 1 1_2   Alice_Bob    
 2 1_3   Alice_Charlie
 3 1_4   Alice_Diane  
 4 1_5   Alice_Fred   
 5 2_3   Bob_Charlie  
 6 2_4   Bob_Diane    
 7 2_5   Bob_Fred     
 8 3_4   Charlie_Diane
 9 3_5   Charlie_Fred 
10 4_5   Diane_Fred 

我可以用crossing来做到这一点,但我想知道是否有更简单的方法:

df_pairs <- df %>% select( id1 = id, name1 = name ) %>% 
  crossing(df %>% select(id2 = id, name2 = name) ) %>%
  dplyr::filter( id1 < id2) %>%
  unite( id, id1, id2 ) %>%
  unite( name, name1, name2 )
r dplyr tidyr combinatorics
1个回答
0
投票

看起来您需要combn

get_combn <- function(x) {
  combn(x, 2, paste, collapse = "_")
}

as.data.frame(lapply(df, get_combn))
© www.soinside.com 2019 - 2024. All rights reserved.