web-dev-qa-db-fra.com

Attribuer un ID unique basé sur deux colonnes

J'ai un dataframe (df) qui ressemble à ceci:

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

Et je voudrais créer une colonne person ID pour que df ressemble à ceci:

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

En d'autres termes, la variable ID indique de quelle personne il s'agit dans l'ensemble de données, ce qui représente à la fois le nombre d'étudiants et l'appartenance à l'école (ici, nous avons 3 étudiants au total).

J'ai fait df$ID <- df$Student Et j'ai essayé de demander la valeur +1 si c("School", "Student) était unique. Ça ne marche pas. Aide appréciée.

9
Quixotic

Nous pouvons le faire dans base R sans faire de groupe par opération

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

REMARQUE: en supposant que "école" et "étudiant" sont ordonnés


Ou en utilisant 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

Comme l'a mentionné @radek, dans la version récente (dplyr_0.8.0), nous recevons la notification que group_indices_ est obsolète, utilisez plutôt group_indices

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

Regrouper par école et étudiant, puis attribuer l'ID de groupe à la variable 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

Données:

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')
6
Sathish