【问题标题】:How to use R to identify twins, and then randomly select and remove one?如何使用 R 识别双胞胎,然后随机选择并删除一个?
【发布时间】:2019-07-24 19:50:40
【问题描述】:

我有一个包含一些双胞胎和三胞胎的数据集。对于每组双胞胎或三胞胎,我需要随机选择一个以保留在数据集中。此信息编码在两列中,FamilyID 和 FamilyOrder。双胞胎和三胞胎共享 FamilyID 和 FamilyOrder。非双胞胎兄弟姐妹共享一个 FamilyID,但具有不同的 FamilyOrder 值。


    FamilyID  FamilyOrder  y
    1         1            45
    1         2            33
    2         1            12
    3         1            76
    3         2            15
    3         2            59
    3         2            22
    4         1            56
    4         1            21

因此,在此示例代码中,FamilyID 3 包含一个非双胞胎(编码为 1)和一组三胞胎(编码为 2),而 FamilyID 4 有一对双胞胎。

我希望输出类似于:

FamilyID  FamilyOrder  y
1         1            45
1         2            33
2         1            12
3         1            76
3         2            22
4         1            56

保留常规兄弟姐妹,但删除每个双胞胎和三胞胎除一个以外的所有兄弟姐妹。

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以使用dplyr...轻松做到这一点...

    library(dplyr)
    
    df %>% 
      group_by(FamilyID, FamilyOrder) %>% 
      sample_n(1)
    
      FamilyID FamilyOrder     y
    1        1           1    45
    2        1           2    33
    3        2           1    12
    4        3           1    76
    5        3           2    22
    6        4           1    56
    

    【讨论】:

      【解决方案2】:

      你提到你只需要随机选择一个。所以first() 应该没问题。

      library(dplyr)
      df %>%
          group_by(FamilyID,FamilyOrder) %>%
          mutate(y = first(y)) %>%
          ungroup()
      

      【讨论】:

        【解决方案3】:

        这是 base 和 data.table 的等价物。

        library(data.table)
        
        dt <- as.data.table(DF)
        dt[, .(y = y[sample.int(length(y), 1)]), by = .(FamilyID, FamilyOrder)]
        
        #equivalent base statements. only problem is that they're not sorted right. 
        aggregate(DF$y
                  , by =DF[, c('FamilyID', 'FamilyOrder')]
                  , FUN = function(x) x[sample.int(length(x), 1)])
        
        aggregate(y ~ FamilyID + FamilyOrder
                  , data = DF
                  , FUN = function(x) x[sample.int(length(x), 1)])
        
          FamilyID FamilyOrder  x
        1        1           1 45
        2        2           1 12
        3        3           1 76
        4        4           1 56
        5        1           2 33
        6        3           2 15
        
        #super base for the first non-duplicate value
        DF[!duplicated(DF[, names(DF) != 'y']), ]
        
          FamilyID FamilyOrder  y
        1        1           1 45
        2        1           2 33
        3        2           1 12
        4        3           1 76
        5        3           2 15
        8        4           1 56
        

        【讨论】:

          猜你喜欢
          • 2021-12-11
          • 1970-01-01
          • 2012-10-27
          • 1970-01-01
          • 2018-03-24
          • 1970-01-01
          • 2010-09-08
          • 1970-01-01
          相关资源
          最近更新 更多