我有一个如下所示的数据框(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。它不起作用。帮助赞赏。
答案 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')