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.
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))
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')