Последовательность строк по группам с использованием двух столбцов

#r #dplyr #seq #cumsum #rle

#r #dplyr #seq #сумма #rle

Вопрос:

Предположим, у меня есть следующий df

 data <- data.frame(ID = c(1,1,1,1,1,1,1,2,2,2,2,3,3,3),
               Value = c(1,1,0,1,0,1,1,1,0,0,1,0,0,0),
               Result = c(1,1,2,3,4,5,5,1,2,2,3,1,1,1))
  

Как я могу получить результат столбца из первых двух столбцов?

Я пробовал разные подходы, используя rle, seq, cumsum и cur_group_id, но не могу легко получить столбец результатов

Комментарии:

1. Можете ли вы уточнить, что вы подразумеваете под получением столбца результатов. Какие вычисления вы пытаетесь выполнить, чтобы получить Result столбец?

2. @KentOrr Взгляните на ответы, я пытался создать идентификатор для каждой комбинации идентификатора и значения. Идентификатор должен быть одинаковым как для идентификатора, так и для значения и увеличиваться при изменении значения столбца ‘Value’

Ответ №1:

 library(data.table)
library(dplyr)

data %>% 
  group_by(ID) %>% 
  mutate(Result2 = rleid(Value))
  

Это дает нам:

      ID Value Result Result2
   <dbl> <dbl>  <dbl>   <int>
 1     1     1      1       1
 2     1     1      1       1
 3     1     0      2       2
 4     1     1      3       3
 5     1     0      4       4
 6     1     1      5       5
 7     1     1      5       5
 8     2     1      1       1
 9     2     0      2       2
10     2     0      2       2
11     2     1      3       3
12     3     0      1       1
13     3     0      1       1
14     3     0      1       1
  

Комментарии:

1. Это было быстро, элегантно и прямолинейно. Спасибо

2. Нет проблем, рад помочь.

Ответ №2:

Работает ли это:

 library(dplyr)
data %>% group_by(ID) %>% mutate(r = rep(seq_along(rle(ID*Value)$values), rle(ID*Value)$lengths))
# A tibble: 14 x 4
# Groups:   ID [3]
      ID Value Result     r
   <dbl> <dbl>  <dbl> <int>
 1     1     1      1     1
 2     1     1      1     1
 3     1     0      2     2
 4     1     1      3     3
 5     1     0      4     4
 6     1     1      5     5
 7     1     1      5     5
 8     2     1      1     1
 9     2     0      2     2
10     2     0      2     2
11     2     1      3     3
12     3     0      1     1
13     3     0      1     1
14     3     0      1     1
  

Комментарии:

1. Спасибо за ваш ответ, основанный только на dplyr. Я пытался сделать что-то подобное с seq_along и rle, но потерпел неудачу

Ответ №3:

Мы могли бы использовать rle с ave помощью base R

 data$Result2 <- with(data, ave(Value, ID, FUN = 
   function(x) inverse.rle(within.list(rle(x), values <- seq_along(values)))))
data$Result2
#[1] 1 1 2 3 4 5 5 1 2 2 3 1 1 1