根据两列分配唯一 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))
我有一个如下所示的数据框 (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))