假设我们有以下数据库:
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)
我的问题是,除了使用循环之外,还有其他功能或更优雅的方法吗?
如果你想要一个单行,就像
df$number.in.group = unlist(lapply(table(df$ID),seq.int))
Run Code Online (Sandbox Code Playgroud)
你可以使用rle
和sequence
:
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
是出于这个目的.
> 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)