2016-04-10 16 views
-1

Meine Daten wie folgt aussehenIndex Dummy-Variablen in 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 

ich eine Spalte hinzufügen mag, die würden Index in Folge 1s in Attrappen, so dass meine endgültigen Daten wie folgt aussehen.

> 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 

Wie kann ich das

in R erreichen

Antwort

2

Mit data.table können wir die rleid Funktion . Konvertieren Sie 'data.frame' in 'data.table', gruppiert nach rleid(Dummy), erstellen wir eine neue Spalte (Dummy_Modified), indem wir (:=) die Ausgabe von 'Dummy' multipliziert mit der Zeilenfolge (seq_len(.N)) zuweisen 0 Werte in "Dummy" bleiben in der Ausgabe als 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 

Mit dplyr, können wir den Einsatz von lag zu prüfen, ob die adjancent Elemente in ‚Dummy‘ sind gleich oder nicht, erhalten die cumsum des logischen Index für die Erstellung einer Gruppierungsspalte (‚gr‘ machen), verwenden wir dieselbe Methode wie oben, um "Dummy_Modified" zu erhalten. Die row_number() in dplyr gibt die Reihenfolge der Zeilen.

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

Kann dies mit dplyr gemacht werden? Ich beabsichtige, die group_by-Funktion zu verwenden –

+0

@RajarshiBhadra Die 'rleid' stammt aus' data.table' – akrun

+0

Wenn diese Aufgabe auf verschiedenen Positionsebenen in einem Datensatz durchgeführt werden soll, wie sollte es dann geändert werden? –

4

Dies sollte

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 den Trick: für 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

Wenn ich dies mit dplyr verwende gibt es Fehler –

+1

Warum wurde diese Antwort downvoted ?? – user20650

+1

Ihre Frage hat dplyr nicht erwähnt. Kannst du ein MWE einfügen? –