2017-01-02 1 views
0

Eine Stichprobe von Daten, die ich habe.
hour <- c(rep(0,5), rep(1,5),rep(0,5), rep(1,5)) rain <- c(rep(0.1,10),rep(0.0,10)) df1<-data.frame(rain,hour) df1$csum <- with(df1, ave(df1$hour, cumsum(df1$hour == 0), FUN = cumsum))logisch basierend auf Zeilen darunter und oben in anderen Vektor

Schritte:
1. Finden Werte von 1 in 'csum' (6/16).
2. Sehen Sie sich die Werte 3 Reihen oben und 5 unten in 'Regen' an (1: 9/11: 19 in diesem Fall), um die durch 1. Schritt in var 'csum' festgelegte Position,
3. wenn ihre Summe ist > = 0,1; als erste drei Werte von 1 in var 'Stunde' (6: 8) werden in 0 umgewandelt, im zweiten Fall bleiben sie gleich, weil Summe 0 ist.

Erwartete Ausgabe: Erste drei Werte von 1 in DF1 $ Stunde geschaltet 0

hour = c(0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1) 
+0

so dass Sie nur einmal diese Schritte ausführen zu wollen? wenn "1" zum ersten Mal auftritt. –

+0

Wenn ich es richtig verstanden habe, genügt ein einfaches 'which()' und ein 'if()' –

+0

genau. 1 bedeutet eigentlich, dass einige andere Kriterien erfüllt wurden und dann schaue ich in Regenzeit im Zeitfenster von 8 Stunden; Wenn es keinen nennenswerten Regen gab (0,1 oder mehr), werden die ersten drei Stunden (Werte von 1) nicht berücksichtigt. –

Antwort

1

es zu diesem Sol viele Verbesserungen sein könnte:

x = which(df1$csum == 1) 

func <- function(i) { 
    lower_lim = i-5 # out-of-bound errors can happen, prefer max(1, (i-5)) 
    upper_lim = i+3 # prefer min(1, (i+3)) 
    if (sum(df1$rain[lower_lim:upper_lim]) >= 0.1){ 
    y <- df1$hour[lower_lim:upper_lim] 
    y[which(y == 1)[1:3]] = 0 
    df1$hour[lower_lim:upper_lim] <- y 
    } 
    assign("df1", df1, envir = .GlobalEnv) 
} 

sapply(x, func) 

# df1 
# rain hour csum 
#1 0.1 0 0 
#2 0.1 0 0 
#3 0.1 0 0 
#4 0.1 0 0 
#5 0.1 0 0 
#6 0.1 0 1 
#7 0.1 0 2 
#8 0.1 0 3 
#9 0.1 1 4 
#10 0.1 1 5 
#11 0.0 0 0 
#12 0.0 0 0 
#13 0.0 0 0 
#14 0.0 0 0 
#15 0.0 0 0 
#16 0.0 1 1 
#17 0.0 1 2 
#18 0.0 1 3 
#19 0.0 1 4 
#20 0.0 1 5 
+0

Nicht wirklich, da ich eine Funktion bekommen muss, die ich an jedem Ort anwenden würde, wo dies in der Reihe passiert, nicht nur beim ersten. Es funktioniert nur für den ersten Fall ... –

+0

U waren fast da. :) Ich habe einige Änderungen an der Frage vorgenommen ... –

+0

Ich mag eigentlich die Verwendung von 'assign()' im Code nicht, aber ich weiß nicht, wie man Änderungen in 'df1' widerspiegelt, die außerhalb des Bereichs von' sapply () '. irgendwie könnte mir hier helfen –

Verwandte Themen