8

簡単な作業のように見えますが、もっと簡単な方法がわかりません。以下にxベクトルがあり、連続する値のグループ名を作成する必要があります。私の試みはrle、より良いアイデアを使用していましたか?

# data
x <- c(1,1,1,2,2,2,3,2,2,1,1)

# make groups
rep(paste0("Group_", 1:length(rle(x)$lengths)), rle(x)$lengths)
# [1] "Group_1" "Group_1" "Group_1" "Group_2" "Group_2" "Group_2" "Group_3" "Group_4"
# [9] "Group_4" "Group_5" "Group_5"
4

4 に答える 4

11

を使用rleidしてdata.table

library(data.table)

rleid(x, prefix = "Group_")
#[1] "Group_1" "Group_1" "Group_1" "Group_2" "Group_2" "Group_2" "Group_3" "Group_4" "Group_4" "Group_5" "Group_5"
于 2016-06-14T10:25:15.133 に答える
10

diffと の使用cumsum:

paste0("Group_", cumsum(c(1, diff(x) != 0)))
#[1] "Group_1" "Group_1" "Group_1" "Group_2" "Group_2" "Group_2" "Group_3" "Group_4" "Group_4" "Group_5" "Group_5"

(値が浮動小数点値の場合は、!=代わりに許容誤差を避けて使用する必要がある場合があります。)

于 2016-06-14T10:32:51.637 に答える
3

cumsum を使用するが、データが数値であることに依存しない:

paste0("Group_", 1 + c(0, cumsum(x[-length(x)] != x[-1])))


[1] "Group_1" "Group_1" "Group_1" "Group_2" "Group_2" "Group_2" "Group_3" "Group_4" "Group_4" "Group_5" "Group_5"
于 2016-06-14T13:04:55.053 に答える