基于个人排名的组 ID

Group ID based on individual rank

我有以下个人数据,我想制作一个唯一的家庭标识符。每个人在家庭中都有自己的等级,所以等级 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).

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)