У меня есть простой фреймворк из 0 и 1

library(dplyr)      
d <- data.frame(x=c(0,0,1,1,0,1,1,1,0,0,1))

Я хочу, чтобы каждая группа единиц была идентифицирована уникальным идентификатором:

   x id
1  0  0
2  0  0
3  1  1
4  1  1
5  0  0
6  1  2
7  1  2
8  1  2
9  0  0
10 0  0
11 1  3

Это можно решить с помощью простого цикла, которого я хочу избежать. Я пробовал использовать group_indices (dplyr), na.locf (zoo) и cumsum, но пока не вижу выхода.

r
1
Xavier Prudent 18 Сен 2018 в 01:45

2 ответа

Лучший ответ

Вы можете сделать это с помощью cumsum и diff

G1 = cumsum(c(d$x[1] == 1, diff(d$x) == 1))
d$id = ifelse(d$x==1, G1, 0)
d
   x id
1  0  0
2  0  0
3  1  1
4  1  1
5  0  0
6  1  2
7  1  2
8  1  2
9  0  0
10 0  0
11 1  3

Вам понадобится часть d$x[1] == 1 в случае, если первый элемент x равен 1.

1
G5W 17 Сен 2018 в 22:54

Простой базовый метод с использованием rle:

r <- rle(d$x)
r$values[r$values == 1] <- seq_len(sum(r$values == 1))
d$id <- rep(r$values,times = r$lengths)
0
joran 17 Сен 2018 в 22:53