tidyverse 中所有可能的对
All possible pairs in tidyverse
我想在不重复的数据帧行之间创建所有可能的对(即 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 )
看来您需要使用 combn
来避免重复。
get_combn <- function(x) {
combn(x, 2, paste, collapse = "_")
}
as.data.frame(lapply(df, get_combn))
# id name
#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
也可以与purrr::map_df
一起应用
purrr::map_df(df, get_combn)
我想在不重复的数据帧行之间创建所有可能的对(即 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 )
看来您需要使用 combn
来避免重复。
get_combn <- function(x) {
combn(x, 2, paste, collapse = "_")
}
as.data.frame(lapply(df, get_combn))
# id name
#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
也可以与purrr::map_df
purrr::map_df(df, get_combn)