2015-11-27 8 views
5

folgende MWE Bedenken Sie:Count Anzahl, wie oft eine Variable wiederholt wird kontinuierlich in R

df <- data.frame(Day=1:10, Value = c("Yes","No","Yes", "Yes", "Yes", 
            "No", "No", "Yes","Yes", "No")) 

Day Value 
    1 Yes 
    2 No 
    3 Yes 
    4 Yes 
    5 Yes 
    6 No 
    7 No 
    8 Yes  
    9 Yes 
    10 No 

ich eine zusätzliche Spalte möchten, dass die Anzahl der ‚Wert‘ zählt, ist bereits kontinuierlich mit ‚Ja‘. Wenn Value also 'Nein' ist, sollte die neue Variable immer 0 sein. Wenn 'Ja' nach 'Nein' zum ersten Mal erscheint, wird sie auf 1 gesetzt. Wenn dann auch die nächste Beobachtung ja ist, sollte sie 2 sein Sobald die Kette von 'Ja' intermittierend ist, wird die neue Variable für das nächste 'Ja' wieder 1 sein. So sollte mein Datenrahmen so aussehen:

Day Value Count 
1 Yes 1 
2 No 0 
3 Yes 1 
4 Yes 2 
5 Yes 3 
6 No 0 
7 No 0 
8 Yes 1 
9 Yes 2 
10 No 0 

Hoffe jemand kann mir helfen.

Antwort

4

Sie können versuchen, "data.table", speziell die rleid Funktion:

Beispiel:

library(data.table) 
as.data.table(df)[, count := sequence(.N), by = rleid(Value)][Value == "No", count := 0][] 
#  Day Value count 
# 1: 1 Yes  1 
# 2: 2 No  0 
# 3: 3 Yes  1 
# 4: 4 Yes  2 
# 5: 5 Yes  3 
# 6: 6 No  0 
# 7: 7 No  0 
# 8: 8 Yes  1 
# 9: 9 Yes  2 
# 10: 10 No  0 
3

Wir base R auch verwenden. Wir erstellen eine Gruppierungsvariable ('grp'), indem wir die angrenzenden Elemente der Spalte 'Wert' und cumsum den logischen Index vergleichen. Dann kann dies in ave verwendet werden, um die Sequenz zu erstellen.

grp <- with(df, cumsum(c(TRUE,Value[-1L]!=Value[-length(Value)]))) 
df$count <- ave(seq_along(df$Value), grp, FUN=seq_along)*(df$Value=='Yes') 
df$count 
#[1] 1 0 1 2 3 0 0 1 2 0 
+0

intelligent! +1, aber ich denke, das Setzen von 'Value [1]! = Value [2]' anstelle des ersten 'TRUE' in' grp' würde es allgemeiner machen. –

+1

@stasg Ich denke, du meintest das Recycling, oder? Vielen Dank. – akrun

Verwandte Themen