【问题标题】:Split table based on ID column moving the dupllicate rows into new table根据 ID 列拆分表,将重复行移动到新表中
【发布时间】:2022-01-11 14:28:51
【问题描述】:

我想将基于 ID 列的表拆分为 2 个或更多表。 将具有重复 ID 值的行移动到新表中(即使其他列没有重复)

表 1 标识值 1 0.94 2 0.94 3 0.20 4 0.38 5 0.71 5 0.20 6 0.34 7 0.67 8 0.89 9 0.76 10 0.26 10 0.11 11 0.92 12 0.11 13 0.72 14 0.93 15 0.70 15 0.72 15 0.70

变成这样

表 1 标识值 1 0.94 2 0.94 3 0.20 4 0.38 5 0.71 6 0.34 7 0.67 8 0.89 9 0.76 10 0.26 11 0.92 12 0.11 13 0.72 14 0.93 15 0.70

表 2 标识值 5 0.20 10 0.11 15 0.72

表 3 标识值 15 0.70

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以在ID 列的rowidsplit

    df <- structure(list(ID = c(1L, 2L, 3L, 4L, 5L, 5L, 6L, 7L, 8L, 9L, 
    10L, 10L, 11L, 12L, 13L, 14L, 15L, 15L, 15L), value = c(0.94, 
    0.94, 0.2, 0.38, 0.71, 0.2, 0.34, 0.67, 0.89, 0.76, 0.26, 0.11, 
    0.92, 0.11, 0.72, 0.93, 0.7, 0.72, 0.7)), row.names = c(NA, -19L
    ), class = "data.frame")
    
    split(df, data.table::rowid(df$ID))
    #> $`1`
    #>    ID value
    #> 1   1  0.94
    #> 2   2  0.94
    #> 3   3  0.20
    #> 4   4  0.38
    #> 5   5  0.71
    #> 7   6  0.34
    #> 8   7  0.67
    #> 9   8  0.89
    #> 10  9  0.76
    #> 11 10  0.26
    #> 13 11  0.92
    #> 14 12  0.11
    #> 15 13  0.72
    #> 16 14  0.93
    #> 17 15  0.70
    #> 
    #> $`2`
    #>    ID value
    #> 6   5  0.20
    #> 12 10  0.11
    #> 18 15  0.72
    #> 
    #> $`3`
    #>    ID value
    #> 19 15   0.7
    

    reprex package (v2.0.1) 于 2022-01-04 创建

    【讨论】:

    • 谢谢它运行良好
    • 现在我使用 library(dplyr) full_join 并排合并了 2 个表。非常感谢您知道如何删除行中的第二个重复项
    【解决方案2】:

    rle 中使用sequence

    split(dat, sequence(rle(dat$ID)$lengths))
    # $`1`
    #    ID value
    # 1   1  0.94
    # 2   2  0.94
    # 3   3  0.20
    # 4   4  0.38
    # 5   5  0.71
    # 7   6  0.34
    # 8   7  0.67
    # 9   8  0.89
    # 10  9  0.76
    # 11 10  0.26
    # 13 11  0.92
    # 14 12  0.11
    # 15 13  0.72
    # 16 14  0.93
    # 17 15  0.70
    # 
    # $`2`
    #    ID value
    # 6   5  0.20
    # 12 10  0.11
    # 18 15  0.72
    # 
    # $`3`
    #    ID value
    # 19 15   0.7
    

    或者aveseq_along

    split(dat, ave(dat$ID, dat$ID, FUN=seq_along))
    # $`1`
    # ID value
    # 1   1  0.94
    # 2   2  0.94
    # 3   3  0.20
    # 4   4  0.38
    # 5   5  0.71
    # 7   6  0.34
    # 8   7  0.67
    # 9   8  0.89
    # 10  9  0.76
    # 11 10  0.26
    # 13 11  0.92
    # 14 12  0.11
    # 15 13  0.72
    # 16 14  0.93
    # 17 15  0.70
    # 
    # $`2`
    # ID value
    # 6   5  0.20
    # 12 10  0.11
    # 18 15  0.72
    # 
    # $`3`
    # ID value
    # 19 15   0.7
    

    数据:

    dat <- structure(list(ID = c(1L, 2L, 3L, 4L, 5L, 5L, 6L, 7L, 8L, 9L, 
    10L, 10L, 11L, 12L, 13L, 14L, 15L, 15L, 15L), value = c(0.94, 
    0.94, 0.2, 0.38, 0.71, 0.2, 0.34, 0.67, 0.89, 0.76, 0.26, 0.11, 
    0.92, 0.11, 0.72, 0.93, 0.7, 0.72, 0.7)), class = "data.frame", row.names = c(NA, 
    -19L))
    

    【讨论】:

    • 谢谢第二个方法拆分(dat, ave(dat$ID, dat$ID, FUN=seq_along))
    • 不客气@m26348762
    猜你喜欢
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 2021-09-21
    • 2015-02-01
    • 2020-04-22
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多