根据两列分配唯一 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)) 才能让它工作。谢谢! @Quixotic duplicated 适用于向量或 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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

SQL 根据两列删除重复记录

R - 根据两列识别和删除重复行

MySQL两列唯一键[重复]

两列上的 BigQuery 重复数据删除作为唯一键

excel中两列都有重复值,怎样筛选出两列唯一值?

从现有的两列 python 创建唯一 ID