【问题标题】:Identifying pairs in two columns in R识别R中两列中的对
【发布时间】:2018-09-08 23:44:07
【问题描述】:

我有一个国家间双边关系的数据框:

C1 C2
US FR
FR US
US DE
DE US
US RU
US FI
RU FI
FI RU

链接是定向的,其中一些链接丢失(例如,我有 US>RU 但不是 RU>US)。我想识别所有独特的配对;有这样的东西:

C1 C2 PairID
US FR 1
FR US 1
US DE 2
DE US 2
US RU -
US FI -
RU FI 3
FI RU 3

有什么建议吗?

【问题讨论】:

  • 您要为US RUUS FI 等非双向关系设置PairID 吗?

标签: r


【解决方案1】:

这是一个选项,假设您还想计算不是双向的关系,例如US>RU

library(dplyr)
df %>%
        mutate(relation = paste(pmin(C1, C2), pmax(C1, C2), sep = "-"), #define the relation no matter the direction
               PairID = cumsum(c(1, head(relation, -1) != tail(relation, -1)))) %>% 
        select(-relation)
# output
  C1 C2 PairID
1 US FR      1
2 FR US      1
3 US DE      2
4 DE US      2
5 US RU      3
6 US FI      4
7 RU FI      5
8 FI RU      5

# Data: df
structure(list(C1 = c("US", "FR", "US", "DE", "US", "US", "RU", 
"FI"), C2 = c("FR", "US", "DE", "US", "RU", "FI", "FI", "RU")), .Names = c("C1", 
"C2"), class = "data.frame", row.names = c(NA, -8L))

【讨论】:

    【解决方案2】:

    我们可以创建一个字符串标识符来捕获给定的一对独立于它们的排序的国家:

    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 &gt; FRFR &gt; US)。这些对将有两个匹配的字符串 ID。

    # 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
    

    剩下要做的就是将新的字符串 ID -> 整数 ID 映射到原始数据,并将 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     
    

    【讨论】:

      猜你喜欢
      • 2017-07-20
      • 2019-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多