按组编号

aat*_*lob 4 r

假设我们有以下数据库:

ID  Shoot  hit
1     10    2
1      9    3
1      8    1
2     10    8
2      8    8
2     11   10
2      7    2
3      9    2
4      6    6
4      6    5
.
.
Run Code Online (Sandbox Code Playgroud)

我希望在每个组中分配数字,在这种情况下每个ID如下:

ID Shoot hit number.in.group
1   10     2    1
1    9     3    2
1    8     1    3
2   10     8    1
2    8     8    2 
2   11    10    3
2    7     2    4
3    9     2    1
4    6     6    1
4    6     5    2
    .
    .
Run Code Online (Sandbox Code Playgroud)

我可以使用循环轻松完成.像这样的东西会起作用:

df$number.in.group = rep(1,nrow(df))

for(i in 2:nrow(df))
    if(df$ID[i]==df$ID[i-1]){
     df$number.in.group[i] = df$number.in.group[i-1] + 1 }  
Run Code Online (Sandbox Code Playgroud)

我的问题是,除了使用循环之外,还有其他功能或更优雅的方法吗?

Sim*_*nek 8

如果你想要一个单行,就像

df$number.in.group = unlist(lapply(table(df$ID),seq.int))
Run Code Online (Sandbox Code Playgroud)


jor*_*ran 8

你可以使用rlesequence:

dat <- read.table(text = "ID  Shoot  hit
+ 1     10    2
+ 1      9    3
+ 1      8    1
+ 2     10    8
+ 2      8    8
+ 2     11   10
+ 2      7    2
+ 3      9    2
+ 4      6    6
+ 4      6    5",sep = "",header = TRUE)

> sequence(rle(dat$ID)$lengths)
 [1] 1 2 3 1 2 3 4 1 1 2
Run Code Online (Sandbox Code Playgroud)

实际上,我认为sequence是出于这个目的.


42-*_*42- 6

> dat$number.in.group <- ave(dat$ID,dat$ID, FUN=seq_along)
> dat
   ID Shoot hit number.in.group
1   1    10   2               1
2   1     9   3               2
3   1     8   1               3
4   2    10   8               1
5   2     8   8               2
6   2    11  10               3
7   2     7   2               4
8   3     9   2               1
9   4     6   6               1
10  4     6   5               2
Run Code Online (Sandbox Code Playgroud)