2017-06-02 16 views
2

Ok, also habe ich eine Reihe von Zahlen. Ich möchte Werte von weniger als -0,10 ausschließen. Wenn jedoch nach dem ersten -0.10 eine Zahl über -0,10 erscheint, ist diese zu ignorieren.R - Zahlen aus der Serie ausschließen

Ich versuche, so weit dplyr für die Aufgabe Gruppierung von rleid zu verwenden, und dann mit einer Art und Weise zu kommen versuchte row_number() so in meiner ersten Reihe von Zahlen zu verwenden, habe ich die Position des unter first Wert markieren - 0.10. Sobald ich die Zeilennummer kenne, können alle anderen Werte after die erste Instanz ignoriert und von der Ausgabe ausgeschlossen werden.

I diese Dummy-Daten verwenden:

x <- c(0,0,-0.07347,-0.08351,-0.09091,-0.10624,-0.08087,-0.10677,-0.14588,-0.13901,-0.13689,0,0,0,-0.09091,0.10624,0.08087,0.10677,0,0) 
y <- c(0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,0,0)   
df <- data.frame (x,y) 

# Remove leading 1 on x column 
df$z <- ifelse(df$x <0 | df$x >0, 1,0) 

# Exclude values (all less than -0.1) 
df$output <- ifelse(df$z == 1 & df$x > -0.1 ,1,0) 

die gewünschte Ausgabe ist, wenn df$z == 1 und auf der ersten Instanz von <-0.10print 0 ... bis zum Ende der Reihe (unabhängig vom Wert der folgenden Nummern)

Dieses Bild zeigt dies und korrekte Ausgabe ist in grün.

enter image description here

* EDIT

Lösung: Umgang mit mehreren Läufen über -0,010

df %>% 
    group_by(rleid=rleid(z)) %>% 
    mutate(outcome=as.numeric(!row_number() > row_number(z==1 & x < -0.1))) %>% 
    mutate(outcome=replace(outcome,z == 1 & x < -0.1, 0)) %>% 
    mutate(outcome=replace(outcome,z == 0, 0)) %>% 
    ungroup() %>% select(-rleid) %>% data.frame() 
+0

Wenn Sie das Foto umbuchen, von uns kann es bearbeiten in für zukünftige Benutzer –

+0

Ich denke, das Problem ist, dass Ihre 'artprice' ein Zeichen. Es sollte funktionieren, wenn Sie Folgendes tun: 'newdf $ artprice <- as.numeric (gsub (" \\ $ "," ", newdf $ artprice))' und erneut ausführen. –

+0

Ok, wie ich gerne lerne ... warum schließen wir \\ $ "," "ein? Ist das, um irgendwelche dieser fehlenden Zeilen, Werte etc. zu eliminieren? –

Antwort

1

Eine Option ist, wenn Anweisungen verschachtelt zu verwenden. Für jeden Fall, der in der Ausgabe normalerweise mit 1 bezeichnet wird, können wir prüfen, ob der x-Wert in der Zeile unmittelbar davor < -0.1 ist. Wenn ja, dann kennzeichnen wir die Ausgabe als 0 für diesen Fall nicht 1.

Die Verzögerungsfunktion, die in Zeilen vor Werten findet, kann in dem dplyr Paket in R zu finden:

require(dplyr) 

df %>% 
    mutate(output=ifelse(z==1 & x > -0.1,ifelse(lag(x) < -0.1,0,1),0)) 

Ausgang:

  x y z output 
1 0.00000 0 0  0 
2 0.00000 1 0  0 
3 -0.07347 1 1  1 
4 -0.08351 1 1  1 
5 -0.09091 1 1  1 
6 -0.10624 1 1  0 
7 -0.08087 1 1  0 
8 -0.10677 1 1  0 
9 -0.14588 1 1  0 
10 -0.13901 1 1  0 
11 -0.13689 1 1  0 
12 0.00000 0 0  0 
13 0.00000 0 0  0 
14 0.00000 1 0  0 
15 -0.09091 1 1  1 
16 0.10624 1 1  1 
17 0.08087 1 1  1 
18 0.10677 1 1  1 
19 0.00000 0 0  0 
20 0.00000 0 0  0 

Edit:

Für mehrere der Bearbeitung von Fällen, können Sie u diese se:

df %>% 
    group_by(rleid=rleid(z)) %>% 
    mutate(outcome=as.numeric(!row_number() > row_number(z==1 & x < -0.1))) %>% 
    mutate(outcome=replace(outcome,z == 1 & x < -0.1, 0)) %>% 
    mutate(outcome=replace(outcome,z == 0, 0)) %>% 
    ungroup() %>% select(-rleid) %>% data.frame() 

Ausgang:

  x y z outcome 
1 0.00000 0 0  0 
2 0.00000 1 0  0 
3 -0.07347 1 1  1 
4 -0.08351 1 1  1 
5 -0.09091 1 1  1 
6 -0.10624 1 1  0 
7 -0.08087 1 1  0 
8 -0.05677 1 1  0 
9 -0.03588 1 1  0 
10 -0.02901 1 1  0 
11 -0.01689 1 1  0 
12 0.00000 0 0  0 
13 0.00000 0 0  0 
14 0.00000 1 0  0 
15 -0.09091 1 1  1 
16 0.10624 1 1  1 
17 0.08087 1 1  1 
18 0.10677 1 1  1 
19 0.00000 0 0  0 
20 0.00000 0 0  0 
+0

wow! genius - sehr gute Idee, ich wusste nicht einmal über verschachtelte if-Anweisungen, das ist sehr nützlich !! Danke, dass du mir das gezeigt hast :) –

+0

Oh ja, ich habe gerade realisiert, was ist mit Situationen, in denen wir mehrere aufeinanderfolgende Werte> -010 haben?Lassen Sie mich ein anderes Szenario bearbeiten –

+0

@AndrewBannerman - Danke, und gern geschehen. Ich habe den Code aktualisiert, um Ihre zusätzlichen Bedingungen zu erfüllen. – www

Verwandte Themen