2016-04-10 3 views
-1

Моих данных выглядят следующим образоминдекса фиктивные переменные в R

> data 
     Date Dummy 
1 2020-01-01  1 
2 2020-01-02  0 
3 2020-01-03  0 
4 2020-01-04  0 
5 2020-01-05  1 
6 2020-01-06  1 
7 2020-01-07  1 
8 2020-01-08  0 
9 2020-01-09  1 
10 2020-01-10  1 
11 2020-01-11  0 

Я хочу, чтобы добавить столбец, который будет индекс последовательных 1s в манекенах, так что мои окончательные данные выглядит следующим образом.

> data 
     Date Dummy Dummy_Modified 
1 2020-01-01  1    1 
2 2020-01-02  0    0 
3 2020-01-03  0    0 
4 2020-01-04  0    0 
5 2020-01-05  1    1 
6 2020-01-06  1    2 
7 2020-01-07  1    3 
8 2020-01-08  0    0 
9 2020-01-09  1    1 
10 2020-01-10  1    2 
11 2020-01-11  0    0 

Как я могу добиться этого в R

ответ

2

С data.table, мы можем использовать функцию rleid , Преобразуйте 'data.frame' в 'data.table', сгруппированный по rleid(Dummy), мы создаем новый столбец (Dummy_Modified), назначая (:=) вывод «Dummy», умноженный на последовательность строк (seq_len(.N)), так что 0 в «Dummy» останется на выходе 0.

library(data.table) 
setDT(data)[, Dummy_Modified := Dummy * seq_len(.N), by = rleid(Dummy)] 
data 
#   Date Dummy Dummy_Modified 
# 1: 2020-01-01  1    1 
# 2: 2020-01-02  0    0 
# 3: 2020-01-03  0    0 
# 4: 2020-01-04  0    0 
# 5: 2020-01-05  1    1 
# 6: 2020-01-06  1    2 
# 7: 2020-01-07  1    3 
# 8: 2020-01-08  0    0 
# 9: 2020-01-09  1    1 
#10: 2020-01-10  1    2 
#11: 2020-01-11  0    0 

Используя dplyr, мы можем сделать использование lag, чтобы проверить, соответствуют ли adjancent элементы в «обманки» такие же или нет, получить cumsum логического индекс для создания столбца группировки («г»), то мы используем тот же метод, что и выше, чтобы получить «Dummy_Modified». row_number() в dplyr дает последовательность строк.

library(dplyr) 
data %>% 
    group_by(gr = cumsum(Dummy!= dplyr::lag(Dummy, default= Dummy[1L]))) %>% 
    mutate(Dummy_Modified = Dummy *row_number()) %>% 
    ungroup() %>% 
    select(-gr) 
#   Date Dummy Dummy_Modified 
#  (chr) (int)   (int) 
#1 2020-01-01  1    1 
#2 2020-01-02  0    0 
#3 2020-01-03  0    0 
#4 2020-01-04  0    0 
#5 2020-01-05  1    1 
#6 2020-01-06  1    2 
#7 2020-01-07  1    3 
#8 2020-01-08  0    0 
#9 2020-01-09  1    1 
#10 2020-01-10  1    2 
#11 2020-01-11  0    0 
+0

Можно ли это сделать, используя dplyr? Я намерен использовать функцию group_by. –

+0

@RajarshiBhadra. 'Rleid' - это' data.table' – akrun

+0

Если эту задачу нужно выполнять на разных уровнях элементов в наборе данных, то как ее изменить? –

4

Это должно сделать трюк

df <- data.frame(dummy = c(1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0)) 
df$dummy_mod <- sequence(rle(df$dummy)$lengths) * df$dummy 
df 
# dummy dummy_mod 
# 1  1   1 
# 2  0   0 
# 3  0   0 
# 4  0   0 
# 5  1   1 
# 6  1   2 
# 7  1   3 
# 8  0   0 
# 9  1   1 
# 10  1   2 
# 11  0   0 

EDIT: для dplyr

library(dplyr) 
df <- data.frame(dummy = c(1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0)) 
df %>% mutate(dummy_mod = sequence(rle(dummy)[["lengths"]]) * dummy) 
+0

Когда я использую это с dplyr, он дает ошибку –

+1

Почему этот ответ был downvoted ?? – user20650

+1

В вашем вопросе не упоминается dplyr. Можете ли вы вставить MWE? –