根据两列分配唯一 ID

Assign unique ID based on two columns

我有一个如下所示的数据框 (df):

School Student  Year  
A         10    1999
A         10    2000
A         20    1999
A         20    2000
A         20    2001
B         10    1999
B         10    2000

我想创建一个 person ID 列,这样 df 看起来像这样:

ID School Student  Year  
1   A         10    1999
1   A         10    2000
2   A         20    1999
2   A         20    2000
2   A         20    2001
3   B         10    1999
3   B         10    2000

换句话说,ID变量表示它在数据集中是哪个人,同时考虑了学生人数和学校成员(这里我们总共有 3 个学生)。

我做了 df$ID <- df$Student 并尝试请求值 +1 如果 c("School", "Student) 是唯一的。它不工作。帮助表示赞赏。

按学校和学生分组,然后将组 ID 分配给 ID 变量。

library('data.table')
df[, ID := .GRP, by = .(School, Student)]

#    School Student Year ID
# 1:      A      10 1999  1
# 2:      A      10 2000  1
# 3:      A      20 1999  2
# 4:      A      20 2000  2
# 5:      A      20 2001  2
# 6:      B      10 1999  3
# 7:      B      10 2000  3

数据:

df <- fread('School Student  Year  
A         10    1999
      A         10    2000
      A         20    1999
      A         20    2000
      A         20    2001
      B         10    1999
      B         10    2000')

我们可以在 base R 中做到这一点而无需进行任何分组操作

df$ID <- cumsum(!duplicated(df[1:2]))
df
#   School Student Year ID
#1      A      10 1999  1
#2      A      10 2000  1
#3      A      20 1999  2
#4      A      20 2000  2
#5      A      20 2001  2
#6      B      10 1999  3
#7      B      10 2000  3

注意:假设 'School' 和 'Student' 是有序的


或使用tidyverse

library(dplyr)
df %>% 
    mutate(ID = group_indices_(df, .dots=c("School", "Student"))) 
#  School Student Year ID
#1      A      10 1999  1
#2      A      10 2000  1
#3      A      20 1999  2
#4      A      20 2000  2
#5      A      20 2001  2
#6      B      10 1999  3
#7      B      10 2000  3

正如@radek 提到的,在最新版本 (dplyr_0.8.0) 中,我们收到 group_indices_ 已被弃用的通知,而是使用 group_indices

df %>% 
   mutate(ID = group_indices(., School, Student))