我的R教师数据框由schoolid组织,每所学校都有不同数量的教师。我想为我的数据集中的每个教师生成一个序列ID号。
数据如下:
SCHOOLID summer
102349 1
102349 1
102349 1
102349 1
203456 1
203456 1
203456 1
345983 1
345983 1
345983 1
345983 1
345983 1
我需要生成的内容:
SCHOOLID summer teacher_id
102349 1 1
102349 1 2
102349 1 3
102349 1 4
203456 1 1
203456 1 2
203456 1 3
345983 1 1
345983 1 2
345983 1 3
345983 1 4
345983 1 5
答案 0 :(得分:0)
这似乎是一种相当常见的问题类型,因此我编写了一个名为getanID
的函数,并将其包含在我的“splitstackshape”包中。用法如下:
library(splitstackshape)
getanID(mydf, "SCHOOLID") ## If just one "ID"
getanID(mydf, c("SCHOOLID", "summer")) ## "ID" can be a vector too
使用ave
这非常简单(在Stack Overflow上肯定是一个重复的问题)。
典型方法(如果您的data.frame
被称为“mydf”)将是:
ave(rep(1, nrow(mydf)), mydf, FUN = seq_along)
# [1] 1 2 3 4 1 2 3 1 2 3 4 5
将“mydf”替换为应被视为分组列的实际列。在这里,我假设两列都应该作为ID。
在上文中,我按整个data.frame
分组。但是,如果您只想按第一列分组,则可以将命令更改为:
ave(rep(1, nrow(mydf)), mydf[1], FUN = seq_along)
(而且,在这一点上,我的回答和Greg几乎相同,除了他使用SCHOOLID
进行聚合而不是1s的虚拟列。)
答案 1 :(得分:0)
尝试(假设数据框名为mydf,相应地更改):
mydf$teacher_id <- ave( mydf$SCHOOLID, mydf$SCHOOLID, FUN=seq_along)