根据两列分配唯一 ID [重复]
Posted
技术标签:
【中文标题】根据两列分配唯一 ID [重复]【英文标题】:Assign unique ID based on two columns [duplicate] 【发布时间】:2017-08-12 19:09:05 【问题描述】:我有一个如下所示的数据框 (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。它不工作。帮助表示赞赏。
【问题讨论】:
as.numeric(factor(paste0(df$School, df$Student)))
【参考方案1】:
我们可以在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
注意:假设“学校”和“学生”是有序的
或使用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))
【讨论】:
我做了第一个,但必须把它写成 cumsum(!duplicated(df$1,df$2)) 才能让它工作。谢谢! @Quixoticduplicated
适用于向量或 data.frame/matrix,但如果您使用两个向量作为参数,它可能不起作用
group_indices_()
已弃用。现在应该是mutate(ID = group_indices(df, School, Student))
?【参考方案2】:
按学校和学生分组,然后将组 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')
【讨论】:
以上是关于根据两列分配唯一 ID [重复]的主要内容,如果未能解决你的问题,请参考以下文章