Мы можем создать строковый идентификатор, который фиксирует данную пару стран независимо от их порядка:
library( tidyverse )
# Original data
X <- data_frame(C1 = c("US", "FR", "US", "DE", "US", "US", "RU", "FI"),
C2 = c("FR", "US", "DE", "US", "RU", "FI", "FI", "RU"))
# Creates an order-independent string ID for each entry
Y <- X %>% mutate( S = map2_chr( C1, C2, ~str_flatten(sort(c(.x,.y))) ) )
# # A tibble: 8 x 3
# C1 C2 S
# <chr> <chr> <chr>
# 1 US FR FRUS
# 2 FR US FRUS
# 3 US DE DEUS
# 4 DE US DEUS
# 5 US RU RUUS
# ...
Затем мы можем использовать эти строковые идентификаторы, чтобы найти пары стран, которые встречаются в обоих направлениях (например, US > FR
и FR > US
). Эти пары будут иметь два совпадающих идентификатора строки.
# Identify string IDs with both orderings and assign an integer ID to each
Z <- Y %>% group_by(S) %>% filter( n() == 2 ) %>% ungroup %>% # Keep groups of size 2
select(S) %>% distinct %>% mutate( PairID = 1:n() ) # Annotate unique values
# # A tibble: 3 x 2
# S PairID
# <chr> <int>
# 1 FRUS 1
# 2 DEUS 2
# 3 FIRU 3
Все, что осталось сделать, это соединить новый идентификатор строки -> целочисленный идентификатор с исходными данными и заменить NA на "-"
:
left_join( Y, Z ) %>% select(-S) %>% mutate_at( "PairID", replace_na, "-")
# # A tibble: 8 x 3
# C1 C2 PairID
# <chr> <chr> <chr>
# 1 US FR 1
# 2 FR US 1
# 3 US DE 2
# 4 DE US 2
# 5 US RU -
# 6 US FI -
# 7 RU FI 3
# 8 FI RU 3