web-dev-qa-db-ja.com

2つの列に基づいて一意のIDを割り当てる

次のようなデータフレーム(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
_

そして、dfが次のようになるようにperson ID列を作成したいと思います。

_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を要求しようとしました。動作していません。感謝します。

9
Quixotic

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))
12
akrun

学校と生徒ごとにグループ化してから、グループ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')
6
Sathish