2016-04-03 15 views
2

Ich habe versucht, dies seit Wochen zu lösen, aber es scheint nicht zu bekommen.R - Conditional Lagging - Wie verzögert man eine bestimmte Anzahl von Zellen, bis eine Bedingung erfüllt ist?

Ich habe folgenden Datenrahmen:

post_id user_id 
1 post-1 user1 
2 post-2 user2 
3 comment-1 user1 
4 comment-2 user3 
5 comment-3 user4 
6 post-3 user2 
7 comment-4 user2 

und will eine neue Variable PARENT_ID erstellen. So dass für jede Beobachtung sollte es die folgenden Schritte durchführen:

  1. Überprüfen Sie, ob post_id entweder post oder comment
  2. ist Wenn post_id ist post dann parent_id sollte die früheste post_id des gesamten Datenrahmens entsprechen.
  3. Wenn post_id ist der erste Eintrag dann parent_idNA
  4. sollte gleich Wenn post_id ist comment dann parent_id zur ersten post_id gleich sollte es trifft.

Der Ausgang etwas aussehen sollte:

post_id user_id parent_id_man 
1 post-1 user1   NA 
2 post-2 user2  post-1 
3 comment-1 user1  post-2 
4 comment-2 user3  post-2 
5 comment-3 user4  post-2 
6 post-3 user2  post-1 
7 comment-4 user2  post-3 

Ich habe versucht, die folgenden:

#Prepare data 
df <- df %>% separate(post_id, into=c("type","number"), sep="-", remove=FALSE) 
df$number <- as.numeric(df$number) 
df <- df %>% mutate(comment_number = ifelse(type == "comment",number,99999)) 
df <- df %>% mutate(post_number = ifelse(type == "post",number,99999)) 

#Create parent_id column 
df <- df %>% mutate(parent_id = ifelse(type == "post",paste("post-",min(post_number), sep=""),0)) 
df <- df %>% mutate(parent_id = ifelse(parent_id == post_id,"NA",parent_id)) 
df <- df %>% select(-comment_number, -post_number) 

Mit diesem Code ich in der Lage bin führen Schritte 1, 2 und 3, aber Schritt 4 ist jenseits von mir. Ich habe das Gefühl, dass eine bestimmte Art von konditionaler Verzögerung das Problem lösen könnte, aber ich weiß nicht, wie ich das machen soll.

Alle Ideen würden sehr geschätzt werden!

+0

Bitte senden Beispiel Daten, gewünschte Ausgabe und Code, den Sie versucht haben. – mtoto

+0

Danke für den Vorschlag @ Mtoto Ich denke, das sollte jetzt viel klarer sein. :) –

Antwort

1

Aufbauend auf Ihrer Lösung

x <- which(df$type == 'post') 
z <- which(df$type == 'comment') 
df$parent_id[df$parent_id == 0] <- df$post_id[x[sapply(z, function(i) findInterval(i, x))]] 
df$parent_id 
#[1] "NA"  "post-1" "post-2" "post-2" "post-2" "post-1" "post-3" 
+0

Danke für deine Antwort Sotos! Ich denke, ich verstehe es, aber ich habe Probleme mit der Anwendung. –

+0

basierend auf Ihren Beispieldaten, sollte es nur durch Kopieren-Einfügen funktionieren ... welche Art von Problemen haben Sie? – Sotos

+0

Sorry für den vorherigen Post versehentlich auf Senden geklickt. Dies sind die Probleme, denen ich begegne: Der sapply Teil dieses Codes: 'df $ post_id [x [sapply (z, Funktion (i) findInterval (i, x))]]' Wendet die Funktion findInterval (i) das ist ein Beitrag, und wendet es auf jeden Kommentar richtig an? Wenn ich diesen Teil des Codes ausführen, bekomme ich einen Faktor mit 7 Ebenen '[1] Post-2 Post-2 Post-2 Post-3' Which korrekt die Beiträge, die die Nullen in Parent_id ersetzen sollte. Aber wenn ich die ganze Linie laufe bekomme ich: [1] "NA" "post-1" "6" "6" "6" "post-1" "7" –

Verwandte Themen