在嵌套的R数据帧中生成顺序ID

时间:2014-03-11 15:24:40

标签: r dataframe sequential

我的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

2 个答案:

答案 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)