R: подсчет последовательных вхождений значений в одном столбце и по группе - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь создать последовательное количество равных значений, количество вхождений.Однако я хочу, чтобы счетчик сбрасывался после ввода нового идентификатора, даже если строка остается последовательной.

Пример того, как выглядят мои данные:

dataset <- data.frame(ID = 
c("a","a","a","a","a","a","a","b","b","b","b","b","b","b")
dataset$YesNO <- c(1,1,0,0,0,1,1,1,1,1,0,0,0,0)

Итак, я хочу создатьновый столбец с результатами:

c(1,2,1,2,3,1,2,1,2,3,1,2,3,4)

Я использовал этот код, который я нашел на этом форуме:

dataset$Counter <- sequence(rle(as.character(dataset$YesNo))$lengths)

Однако это не сбрасывает счетдля нового идентификационного номера.Вместо этого последовательный отсчет продолжается, и в результате получается:

c(1,2,1,2,3,1,2,3,4,5,1,2,3,4)

Какой шаг мне не хватает, чтобы сбросить его на основе идентификатора.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

Используйте rleid (из пакета data.table), чтобы получить переменную группировки, а затем используйте ave, чтобы применить seq_along в рамках общих значений этой группировки:

library(data.table)
transform(dataset, Counter = ave(YesNO, rleid(ID, YesNO), FUN = seq_along))

, давая:

   ID YesNO Counter
1   a     1       1
2   a     1       2
3   a     0       1
4   a     0       2
5   a     0       3
6   a     1       1
7   a     1       2
8   b     1       1
9   b     1       2
10  b     1       3
11  b     0       1
12  b     0       2
13  b     0       3
14  b     0       4
0 голосов
/ 07 февраля 2019

Также одна dplyr возможность:

dataset %>%
 group_by(ID, grp = {grp = rle(YesNO); rep(seq_along(grp$lengths), grp$lengths)}) %>%
 mutate(Counter = seq_along(grp)) %>%
 ungroup() %>%
 select(-grp)

   ID    YesNO Counter
   <fct> <dbl>   <int>
 1 a        1.       1
 2 a        1.       2
 3 a        0.       1
 4 a        0.       2
 5 a        0.       3
 6 a        1.       1
 7 a        1.       2
 8 b        1.       1
 9 b        1.       2
10 b        1.       3
11 b        0.       1
12 b        0.       2
13 b        0.       3
14 b        0.       4
0 голосов
/ 07 февраля 2019

Вы можете сделать:

dataset$Counter <- with(dataset,
                        ave(YesNO, ID, FUN = function(x) sequence(rle(as.character(x))$lengths)))

Вывод:

   ID YesNO Counter
1   a     1       1
2   a     1       2
3   a     0       1
4   a     0       2
5   a     0       3
6   a     1       1
7   a     1       2
8   b     1       1
9   b     1       2
10  b     1       3
11  b     0       1
12  b     0       2
13  b     0       3
14  b     0       4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...