【问题标题】:Group ID based on individual rank基于个人排名的组 ID
【发布时间】:2018-12-04 16:05:13
【问题描述】:

我有以下个人数据,我想制作一个唯一的家庭标识符。每个人在家庭中都已经有了自己的等级,所以基本上等级 1 标志着新家庭的开始。 例如

rank name
1    John
2    Lisa
3    Stu
1    Phil
1    Mike
1    Florence
2    George
3    David
4    Diana
1    Eleanor

我要找的结果是这样的:

rank name      id
1    John      1
2    Lisa      1
3    Stu       1
1    Phil      2
1    Mike      3
1    Florence  4
2    George    4
3    David     4
4    Diana     4
1    Eleanor   5

大约有 320 000 个人,因此组 id 应该从 1 变为 sum(df$rank[rank = 1]) 或类似的值。任何其他类型的唯一 ID 也可以,它不必是 seq(1,n,1)。

【问题讨论】:

    标签: r uniqueidentifier


    【解决方案1】:
    df$id <- cumsum(df$rank == 1)
    
    #    rank     name id
    # 1     1     John  1
    # 2     2     Lisa  1
    # 3     3      Stu  1
    # 4     1     Phil  2
    # 5     1     Mike  3
    # 6     1 Florence  4
    # 7     2   George  4
    # 8     3    David  4
    # 9     4    Diana  4
    # 10    1  Eleanor  5
    

    正如@Andre Elrico 所指出的,如果rankNA 对于任何行,上面的方法将为您在所有后续行中为id 提供NA,因此如果您知道,您可以使用下面的选项rank 可能是 NA(但不是应该是 1)。

    df$id <- cumsum(df$rank %in% 1)
    

    使用的数据:

    df <- read.table(text = '
    rank name
    1    John
    2    Lisa
    3    Stu
    1    Phil
    1    Mike
    1    Florence
    2    George
    3    David
    4    Diana
    1    Eleanor
    ', header = T)
    

    【讨论】:

    • cumsum(df$rank %in% 1)NA 排名的情况下
    • 好点。虽然如果有 NAs 我会担心在应该是 1 的地方有一个 NA,这无论如何都会弄乱ids
    • 当然,我只是对它进行了基准测试。 %in%== 慢得多。只是想把它扔掉,以防你的解决方案在 OP 上失败。
    猜你喜欢
    • 2013-01-23
    • 2012-07-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2020-04-14
    • 1970-01-01
    相关资源
    最近更新 更多