その他の 2 つのオプション:
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))