另外两个选项:
1)使用包中的.GRP
功能data.table
:
library(data.table)
setDT(dat)[, num := .GRP, by = site]
使用下面的示例数据集会导致:
> dat
site score num
1: 1 0.14945795 1
2: 1 0.60035697 1
3: 1 0.94643075 1
4: 8 0.68835336 2
5: 8 0.50553372 2
6: 8 0.37293624 2
7: 4 0.33580504 3
8: 4 0.04825135 3
9: 4 0.61894754 3
10: 8 0.96144729 2
11: 8 0.65496051 2
12: 8 0.51029199 2
2)使用以下group_indices
功能dplyr
:
dat$num <- group_indices(dat, site)
或者当您想解决非标准评估时:
library(dplyr)
dat %>%
mutate(num = group_indices_(dat, .dots = c('site')))
这导致:
site score num
1 1 0.42480366 1
2 1 0.98736177 1
3 1 0.35766187 1
4 8 0.06243182 3
5 8 0.55617002 3
6 8 0.20304632 3
7 4 0.90855921 2
8 4 0.25215078 2
9 4 0.44981251 2
10 8 0.60288270 3
11 8 0.46946587 3
12 8 0.44941782 3
可以看出,dplyr
给出了组号的不同顺序。
如果每次组更改时都需要另一个号码,还有其他几个选项:
1)以 R 为底:
# option 1:
dat$num <- cumsum(c(TRUE, head(dat$site, -1) != tail(dat$site, -1)))
# option 2:
x <- rle(dat$site)$lengths
dat$num <- rep(seq_along(x), times=x)
2)随data.table
包:
library(data.table)
setDT(dat)[, num := rleid(site)]
这一切都导致:
> dat
site score num
1 1 0.80817855 1
2 1 0.07881334 1
3 1 0.60092828 1
4 8 0.71477988 2
5 8 0.51384565 2
6 8 0.72011650 2
7 4 0.74994627 3
8 4 0.09564052 3
9 4 0.39782587 3
10 8 0.29446540 4
11 8 0.61725367 4
12 8 0.97427413 4
使用数据:
dat <- data.frame(site = rep(c(1,8,4,8), each = 3), score = runif(12))