Увеличение на единицу для каждого изменения в группе в R - PullRequest
3 голосов
/ 20 марта 2019

Я пытаюсь изменить это

data.frame(id=c(1,1,1,1,1,2,2), val=c('a','a','b','a','a','a','b'))
  id val
1  1   a
2  1   a
3  1   b
4  1   a
5  1   a
6  2   a
7  2   b

на

  id val
1  1   1
2  1   1
3  1   2
4  1   3
5  1   3
6  2   1
7  2   2

. Для каждого id значение val начинается с 1 и увеличивается на 1, когда val изменений.

Ответы [ 4 ]

5 голосов
/ 20 марта 2019

Одна dplyr возможность может быть:

df %>%
 group_by(id) %>%
 mutate(val = with(rle(as.numeric(val)), rep(seq_along(lengths), lengths)))

     id   val
  <dbl> <int>
1     1     1
2     1     1
3     1     2
4     1     3
5     1     3
6     2     1
7     2     2

Та же идея, используя rleid() из data.table:

df %>%
 group_by(id) %>%
 mutate(val = rleid(val))
2 голосов
/ 20 марта 2019

data.table х rleid() сделано для этого:

library(data.table)
setDT(xy)
xy[, rleid(val), id]

   id V1
1:  1  1
2:  1  1
3:  1  2
4:  1  3
5:  1  3
6:  2  1
7:  2  2
2 голосов
/ 20 марта 2019

Вот базовое решение R.

f <- as.integer(as.factor(df1$val))
1 + ave(f, df1$id, FUN = function(x) cumsum(c(0, diff(x) != 0)))
#[1] 1 1 2 3 3 1 2

Затем присвойте результат df1$val.

2 голосов
/ 20 марта 2019

С помощью dplyr мы можем group_by id и увеличивать счетчик каждый раз, когда следующее значение меняется с текущего.

library(dplyr)

df %>%
  group_by(id) %>%
  mutate(val = cumsum(val != lag(val, default = TRUE)))

#     id   val
#   <dbl> <dbl>
#1     1     1
#2     1     1
#3     1     2
#4     1     3
#5     1     3
#6     2     1
#7     2     2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...