根据两列分配唯一ID

时间:2017-03-21 08:22:57

标签: r multiple-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

我想创建一个人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是唯一的,我做c("School", "Student)并尝试请求值+1。它不起作用。帮助赞赏。

2 个答案:

答案 0 :(得分:10)

我们可以在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

注意:假设&#39; School&#39;和#39;学生&#39;订购

或使用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))

答案 1 :(得分:3)

按学校和学生分组,然后将组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')