2017-11-07 9 views
2

Ich habe eine Daten, die ich zuerst einige Zeilen filtern und diese verbleibenden Zeilen summieren soll.Filtern und Summieren von Zeilen in dplyr

Die Filterbedingungen wie folgt;

  1. für gr == 1 das letzte Vorkommen von y_value==10 finden und halten, die alle Zeilen, bevor er (einschließlich des letzten Vorkommens dieser Wert 10 Zeile)!
  2. für gr == 2 Finden Sie das erste Vorkommen von y_value==10 und behalten Sie alle Zeilen nach ihm (einschließlich der ersten Vorkommen dieses Wertes 10 Zeile)!

Die Daten sind wie folgt;

df <- data.frame(gr=rep(c(1,2),c(8,7)), 
       y_value=c(c(2,10,10,8,10,6,0,0),c(0,0,10,10,6,8,10))) 



    gr y_value 
1 1  2 
2 1  10 
3 1  10 
4 1  8 
5 1  10 
6 1  6 
7 1  0 
8 1  0 
9 2  0 
10 2  0 
11 2  10 
12 2  10 
13 2  6 
14 2  8 
15 2  10 

Ich habe versucht, dies im Lichte der summing-rows-based-on-conditional-in-groups;

df_temp <- df %>% 
    group_by(gr) %>% 
    mutate(rows_to_aggregate=cumsum(y_value==10)) %>% 
    filter(ifelse(gr==1, rows_to_aggregate !=0, ifelse(gr==2, rows_to_aggregate ==0 | y_value==10, rows_to_aggregate ==0))) %>% 
    filter(ifelse(gr==1, row_number(gr) != 1, ifelse(gr==2, row_number(gr) != n(), rows_to_aggregate ==0))) 

aber das, wenn ich rows_to_aggregate !=0 in gr==1 die Reihen im Interesse tun werden verschwunden sein! Irgendein Führer an diesem Punkt wird geschätzt!

Antwort

2
df_to_aggregate <- df %>% 
    group_by(gr) %>% 
    mutate(rows_to_aggregate = cumsum(y_value == 10)) %>% 
    filter(!(gr == 1 & rows_to_aggregate == max(rows_to_aggregate) & y_value != 10)) %>% 
    filter(!(gr == 2 & rows_to_aggregate == 0)) %>% 
    select(-rows_to_aggregate) 
df_to_aggregate 

# A tibble: 10 x 2 
# Groups: gr [2] 
    gr y_value 
    <dbl> <dbl> 
1  1  2 
2  1  10 
3  1  10 
4  1  8 
5  1  10 
6  2  10 
7  2  10 
8  2  6 
9  2  8 
10 2  10 
+0

Danke für die clevere Antwort, OTH Ich möchte die '10' nach der' 8' in 'gr == 1' behalten. Das ist der größte Flaschenhals: (Ich habe auch das OP aktualisiert. Entschuldigung, dass ich das erwähnen sollte! – Alexander

+1

@Alexander Ich sehe. Ändern der Filterbedingungen ein wenig tun sollte. Aktualisierte meine Antwort. – Paul

+0

Vielen Dank. Ihr Algorithmus ist groß! – Alexander

2

Sie nicht wissen, wie es in dplyr zu tun, aber dieser Code scheint für jeden gr

gr1 = df[df$gr==1,] 
last = tail(which(gr1$y_value==10),1) 
gr1 = gr1[1:(last-1),] 
gr2 = df[df$gr==2,] 
first = head(which(gr2$y_value==10),1) 
gr2 = gr2[(first+1):dim(gr2)[1],] 
final = rbind(gr1,gr2) 
+0

Dank. Ich wünsche eine Lösung in dplyr wenn möglich;) – Alexander

1

Sie können slice mit einem anderen Slicing Zustand zu arbeiten.

df %>% 
    group_by(gr) %>% 
    slice(if(any(gr==1)) {1:max(which(y_value==10))} else {min(which(y_value==10)):n()}) 
 gr y_value 
1  1  2 
2  1  10 
3  1  10 
4  1  8 
5  1  10 
6  2  10 
7  2  10 
8  2  6 
9  2  8 
10  2  10 
Verwandte Themen