#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