代码之家  ›  专栏  ›  技术社区  ›  Jason

出现在多行中的匹配对

  •  2
  • Jason  · 技术社区  · 6 年前

    我在跟踪谁和谁配对,这样我就可以跟踪后代以后会得到什么特质。雌性配对的数据和与谁配对的数据在数据框中,但我也希望在其中有相互关系(因此selfID是d和E的行应该分别有mateID的A和B)。有没有简单的方法?现在什么都没想到。。。

    df <- structure(list(selfID = c("A", "B", "C", "D", "E"), mateID = c("D", 
    "E", NA, NA, NA), sex = c("female", "female", "female", "male", 
    "male"), paired = c(TRUE, TRUE, FALSE, NA, NA)), row.names = c(NA, 
    -5L), class = c("tbl_df", "tbl", "data.frame"))
    
    selfID mateID sex    paired
      <chr>  <chr>  <chr>  <lgl> 
    1 A      D      female TRUE  
    2 B      E      female TRUE  
    3 C      NA     female FALSE 
    4 D      NA     male   NA    
    5 E      NA     male   NA 
    
    3 回复  |  直到 6 年前
        1
  •  1
  •   OzanStats    6 年前

    以下是一种可能的方法:

    for(i in df$mateID[!is.na(df$mateID)]) {
      df$mateID[df$selfID == i] <- df$selfID[df$mateID == i & !is.na(df$mateID)]
    }
    
    df$paired[!is.na(df$mateID)] <- T
    
    df
    # # A tibble: 5 x 4
    # selfID mateID sex    paired
    # <chr>  <chr>  <chr>  <lgl> 
    # 1 A      D      female TRUE  
    # 2 B      E      female TRUE  
    # 3 C      <NA>   female FALSE 
    # 4 D      A      male   TRUE  
    # 5 E      B      male   TRUE
    
        2
  •  1
  •   pogibas    6 年前

    merge 与自身(不进行循环)。

    library(dplyr)
    merge(df, df, by.x = "selfID", by.y = "mateID", all.x = TRUE) %>%
        mutate(mateID = ifelse(is.na(mateID), selfID.y, mateID),
               paired = ifelse(is.na(paired.x), paired.y, paired.x)) %>%
        select(selfID, sex = sex.x, mateID, paired)
    
        3
  •  1
  •   Community Dai    4 年前

    自连接 :

    PoGibas' answer 它使用 left_join() 而不是 merge() coalesce() ifelse() :

    library(dplyr)
    df %>% 
      left_join(df, by = c("selfID" = "mateID")) %>% 
      mutate(mateID = coalesce(mateID, selfID.y), 
             paired = coalesce(paired.x, paired.y)) %>% 
      select(selfID, mateID, sex = sex.x, paired)
    
    # A tibble: 5 x 4
      selfID mateID sex    paired
      <chr>  <chr>  <chr>  <lgl> 
    1 A      D      female TRUE  
    2 B      E      female TRUE  
    3 C      NA     female FALSE 
    4 D      A      male   TRUE  
    5 E      B      male   TRUE
    

    2.数据表

    ),这是一个使用 data.table 自联接中的更新

    library(data.table)
    setDT(df)[df, on = .(selfID = mateID), `:=`(mateID = i.selfID, paired = TRUE)]
    df
    
       selfID mateID    sex paired
    1:      A      D female   TRUE
    2:      B      E female   TRUE
    3:      C   <NA> female  FALSE
    4:      D      A   male   TRUE
    5:      E      B   male   TRUE