2017-05-11 3 views
1

Ich habe folgenden Datenrahmen:Mit ifelse Funktion von Gruppe

example.frame = data.frame("ID" = c(1,1,1,1,2,2,2,3,3,3,3) 
          , "AL" = c(1,1,2,4,1,3,4,1,5,1,2) 
          , "marker" = c(0,0,0,0,0,0,0,0,0,1,1)) 

Was ich erreichen möchte ist, dass für jede ID Gruppe der Variablen unter den folgenden Bedingungen gefüllt sind. Es ist 1 für alle Zeilen, die einem AL von 5 oder höher (in der Reihe vorher) folgen, andernfalls ist es 0. Hat jemand einen Vorschlag wie man es löst? Ich habe es mit by() versucht, aber ich weiß nicht, wie man die Bedingung formuliert.

Vielen Dank im Voraus

+0

sollte nicht der letzte Markerwert "0" sein, da der vorherige AL 1 war? –

+0

Danke für den Hinweis. Ich habe die Frage bearbeitet. – burton030

Antwort

4

eine Idee über die Basis R, umfassen, die davon ausgeht, dass es nur 1 Wert> = 5 in jeder Gruppe,

with(example.frame, ave(AL, ID, FUN = function(i) 
            replace(cumsum(i >= 5), i >= 5, 0))) 

#[1] 0 0 0 0 0 0 0 0 0 1 1 
+0

sie suchen nach 5 oder höheren Werten –

+0

oops ... verpasst, dass ... bearbeitet – Sotos

+0

Ich denke, diese Lösung hat immer noch zwei Probleme, die man sehen kann, wenn man die Daten in 'example.frame $ AL [10] <- 6' ändert. –

1

Eine Lösung mit dplyr

library(dplyr) 
example.frame = data.frame("ID" = c(1,1,1,1,2,2,2,3,3,3,3) 
          , "AL" = c(1,1,2,4,1,3,4,1,5,1,2)) %>% 
    group_by(ID) %>% 
    mutate(marker = as.numeric(cummax(lag(AL, default = 0)) >= 5)) 

example.frame 
+1

Sie wollen alle folgenden Marker-Werte in dieser Gruppe sein 1 –

+0

@docendodiscimus Ups, verpasste diese Nuance. Zum Ausgleich ein 'cummax' hinzugefügt. – Benjamin

2

Wir data.table

library(data.table) 
setDT(example.frame)[, marker := +((cumsum(shift(AL >=5, fill=FALSE)))>0), ID] 
example.frame 
# ID AL marker 
# 1: 1 1  0 
# 2: 1 1  0 
# 3: 1 2  0 
# 4: 1 4  0 
# 5: 2 1  0 
# 6: 2 3  0 
# 7: 2 4  0 
# 8: 3 1  0 
# 9: 3 5  0 
#10: 3 1  1 
#11: 3 2  1 
+0

dies wird Werte> 1 erstellen, sobald ein zweiter Wert> = 5 erscheint –

+0

@docendodiscimus Danke, korrigiert für diese – akrun

3

Hier ist eine Basis R-Lösung mit ave und cummax

example.frame$marker <- ave(example.frame$AL, example.frame$ID, 
          FUN=function(x) cummax(x >= 5)) 

example.frame 
    ID AL marker 
1 1 1  0 
2 1 1  0 
3 1 2  0 
4 1 4  0 
5 2 1  0 
6 2 3  0 
7 2 4  0 
8 3 1  0 
9 3 5  1 
10 3 1  1 
11 3 2  1 
verwenden

Oder, wenn das Ziel in der Reihe nach 5 oder mehr zu starten ist angetroffen wird, könnten Sie c und head wie diese

ave(example.frame$AL, example.frame$ID, FUN=function(x) c(0, head(cummax(x >= 5), -1))) 
[1] 0 0 0 0 0 0 0 0 0 1 1