2016-06-24 3 views
1

Ich mag würde nur Personen auszuwählen, die „nichts“ in der Spalte Ereignisse nach dem letzten „RFA“Subset nach einer Reihe Vergleich in der gleichen Spalte

Eingang haben:

structure(list(Person = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 
3L, 3L, 4L, 5L, 5L, 5L, 5L), Date = c("13/04/13", "14/05/14", 
"14/05/14", "15/02/15", "13/04/13", "14/05/14", "14/08/14", "14/09/14", 
"14/08/15", "15/10/12", "15/10/14", "15/10/12", "04/03/13", "05/03/13", 
"06/03/13", "07/03/13"), EVENT = c("RFA", "RFA", "RFA", "nothing", 
"RFA", "EMR", "nothing", "RFA", "nothing", "nothing", "nothing", 
"EMR", "RFA", "RFA", "RFA", "nothing")), .Names = c("Person", 
"Date", "EVENT"), class = "data.frame", row.names = c(NA, -16L 
)) 

Ausgang:

Person Date EVENT 
1 13/04/13 RFA 
1 14/05/14 RFA 
1 14/05/14 RFA 
1 15/02/15 nothing 
2 13/04/13 RFA 
2 14/05/14 EMR 
2 14/08/14 nothing 
2 14/09/14 RFA 
2 14/08/15 nothing 
5 04/03/13 RFA 
5 05/03/13 RFA 
5 06/03/13 RFA 
5 07/03/13 nothing 

, was ich versucht habe:

library(dplyr) 
PostAblation<-Therap %>% 
    arrange(Person, as.Date(Therap$Date, '%d/%m/%y')) %>% 
    group_by(Person) %>% 
    filter(last(EVENT == "nothing") & EVENT == "RFA") 

aber ich bekomme nicht das Ergebnis, das ich erwarte

+0

'df%>% Filter (EVENT == "nichts" und lag (EVENT == "RFA"))'? etwas wie das? – Psidom

+0

Aber das würde für jede Situation zutreffend sein, wenn "nichts" RFA gefolgt ist, während ich der letzten RFA folgen möchte –

+0

Was meinst du mit letzter RFA? Kannst du deine gewünschte Ausgabe einfügen? – Psidom

Antwort

3

Ich denke, Ihre Logik ist ein wenig kompliziert. Aber vielleicht so etwas wie diese:

df %>% group_by(Person) %>% filter(EVENT[max(which(EVENT == "RFA")) + 1] == "nothing") 

Source: local data frame [13 x 3] 
Groups: Person [3] 

    Person  Date EVENT 
    (int) (chr) (chr) 
1  1 13/04/13  RFA 
2  1 14/05/14  RFA 
3  1 14/05/14  RFA 
4  1 15/02/15 nothing 
5  2 13/04/13  RFA 
6  2 14/05/14  EMR 
7  2 14/08/14 nothing 
8  2 14/09/14  RFA 
9  2 14/08/15 nothing 
10  5 04/03/13  RFA 
11  5 05/03/13  RFA 
12  5 06/03/13  RFA 
13  5 07/03/13 nothing 

Welche sagt die letzten RFA von nothing folgt, vorausgesetzt, Ihre Daten durch Person und Date bestellt. Eine modifizierte Version wäre:

df %>% group_by(Person) %>% filter(max(which(EVENT == "nothing")) > max(which(EVENT == "RFA")) & 
     length(which(EVENT == "RFA")) != 0) 

Welche ist weniger gierig als die erste Logik, wird es so lange wahr sein, wie die Person sowohl nothing hat und RFA und es gibt nothing nach den letzten RFA.

+0

Dies wird auch die Warnmeldung haben. Da für eine Person die Veranstaltung nicht "RFA" hat. Aber da "-Inf" zurückgegeben wird und wir versuchen, den maximalen Index zu finden, kann er ignoriert werden. – Psidom

2

Sie können die Daten auf Person teilen und schauen, um den maximalen Index von "RFA" -Einträgen zu finden. Fügen Sie dann 1 zu diesem Index hinzu und prüfen Sie, ob der Eintrag, der dem nächsten EVENT entspricht, "nichts" ist. Wenn ja, behalten Sie es:

splitPerson <- split(d, d$Person) 

afterNothing <- lapply(splitPerson, function(ii) max(which(ii$EVENT == "RFA")) + 1) 

keepers <- which(mapply(function(x, y) x[["EVENT"]][y] == "nothing", splitPerson, afterNothing)) 


d[d[["Person"]] %in% keepers, ] 
# Person  Date EVENT 
#1  1 13/04/13  RFA 
#2  1 14/05/14  RFA 
#3  1 14/05/14  RFA 
#4  1 15/02/15 nothing 
#5  2 13/04/13  RFA 
#6  2 14/05/14  EMR 
#7  2 14/08/14 nothing 
#8  2 14/09/14  RFA 
#9  2 14/08/15 nothing 
#13  5 04/03/13  RFA 
#14  5 05/03/13  RFA 
#15  5 06/03/13  RFA 
#16  5 07/03/13 nothing 
+0

gibt bekomme ich die Warnung "In max (was ($ EVENT ==" nothing ")): keine nicht fehlenden Argumente bis max; Rückgabe -Inf" von der b4nothing <- Linie –

+0

OK auf der Keeper-Linie bekomme ich den Fehler Fehler in dem (Mapply (Funktion (x, y) x [["EVENT"]] [y] == "RFA", splitPerson,: Argument zu 'was' ist nicht logisch ....... Die Ausgabe von der b4nothing Linie ist eine Reihe von Zahlen für jede Person ist das richtig? –

+0

Ah, es funktioniert für mich, ohne '== TRUE' auf R 3.3. 0. Sie können auf 'which (Mapply (Funktion (x, y) x [[" EVENT "]] [y] ==" nichts ", splitPerson, afterNothing) == TRUE)' – Jota

1

Eine weitere Option ist mit data.table

library(data.table) 
setDT(df)[, if(any(EVENT == "RFA") & all(EVENT[tail(which(EVENT == "RFA"), 
       1)+1]=="nothing")) .SD , Person] 
# Person  Date EVENT 
#1:  1 13/04/13  RFA 
#2:  1 14/05/14  RFA 
#3:  1 14/05/14  RFA 
#4:  1 15/02/15 nothing 
#5:  2 13/04/13  RFA 
#6:  2 14/05/14  EMR 
#7:  2 14/08/14 nothing 
#8:  2 14/09/14  RFA 
#9:  2 14/08/15 nothing 
#10:  5 04/03/13  RFA 
#11:  5 05/03/13  RFA 
#12:  5 06/03/13  RFA 
#13:  5 07/03/13 nothing 
Verwandte Themen