次のようなデータフレーム(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を要求しようとしました。動作していません。感謝します。
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))
学校と生徒ごとにグループ化してから、グループ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')