2017-08-16 1 views
0

Entschuldigung, wenn dies zuvor gefragt wurde. Ich konnte keine befriedigenden Antworten finden, obwohl es sich anhört, als sollte es eine ziemlich einfache Operation sein.Anwenden von dplyr Filter-Operation auf bestimmte Zeilen, ohne andere Daten zu verlieren

Ich habe meine Daten

transition_frame      name state_number lifetime 
      <int>      <chr>  <dbl> <dbl> 
1    38 //Traces_exp1_tif_pair10   1  NA 
2    44 //Traces_exp1_tif_pair10   2  6 
3    352 //Traces_exp1_tif_pair10   3  308 
4    362 //Traces_exp1_tif_pair10   4  10 
5    379 //Traces_exp1_tif_pair10   5  17 
6    388 //Traces_exp1_tif_pair10   6  9 

Es war leicht genug, um die zeilenweise Unterschiede zwischen dem Übergangsrahmen zu berechnen, aber da es kein „Übergang“ zwischen Staat 0 und 1 ist, bricht es den Fluss.

Wie kann ich nur die erste Zeile transition_frame - 1 sein (Hinweis, es ist 37), ohne andere Daten zu berühren? Stellen Sie sich vor

,

group_by(name) %>% 
filter(state_number == 1) %>% 
mutate(lifetime = transition_frame - 1) %>% 
unfilter() # To retrieve dropped data 

, die in einer ganzen Reihe führen würde, mit der ersten Zeile berechnet und NICHT nur die erste Reihe.

transition_frame      name state_number lifetime 
      <int>      <chr>  <dbl> <dbl> 
1    38 //Traces_exp1_tif_pair10   1  37 
2    44 //Traces_exp1_tif_pair10   2  6 
3    352 //Traces_exp1_tif_pair10   3  308 
4    362 //Traces_exp1_tif_pair10   4  10 
5    379 //Traces_exp1_tif_pair10   5  17 
6    388 //Traces_exp1_tif_pair10   6  9 
+0

Ich verstehe deine Fragen nicht wirklich, aber vielleicht suchst du nach 'coalesce'. – Axeman

+0

Hinzugefügt etwas mehr Code. Erklärt das besser? –

+0

fügen Sie bitte Ihre erwartete Ausgabe hinzu. – Prradep

Antwort

1

Funktioniert das Folgende für Sie?

df <- data.frame(transition_frame = c(38, 44, 352, 362, 379, 388), 
       name = rep("//Traces_exp1_tif_pair10", 6), 
       state_number = seq(1, 6)) 

df %>% mutate(lifetime = diff(c(1, transition_frame))) 

    transition_frame      name state_number lifetime 
1    38 //Traces_exp1_tif_pair10   1  37 
2    44 //Traces_exp1_tif_pair10   2  6 
3    352 //Traces_exp1_tif_pair10   3  308 
4    362 //Traces_exp1_tif_pair10   4  10 
5    379 //Traces_exp1_tif_pair10   5  17 
6    388 //Traces_exp1_tif_pair10   6  9 

1 Ersetzen Sie mit anderen Werten in diff(), wenn Sie auf verschiedene Werte den Übergang Rahmen im Zustand 0 zu nehmen.

1

Hoffe ein Ansatz ähnlich wie unten Code könnte Ihnen helfen!

df <- data.frame(transition_frame=c(38,44,352), 
       name=c('//Traces_exp1_tif_pair10','//Traces_exp1_tif_pair10','//Traces_exp1_tif_pair10'), 
       state_number=c(1,2,3), 
       lifetime=c(NA,6,308)) 
df[df$state_number==1 & is.na(df$lifetime),"lifetime"] <- 
    df[df$state_number==1 & is.na(df$lifetime),"transition_frame"] - 1 
df 
+0

Nicht zu elegant, aber es funktioniert. Vielen Dank! Ich werde immer noch nach der dplyr-Version Ausschau halten :) –

Verwandte Themen