Es kann keine Möglichkeit gefunden werden, eine neue Spalte basierend auf den if-Bedingungen für eine Gruppe von Ereignissen in einer Spalte zu generieren.
Die Spalte mit der Bezeichnung "BF" repräsentiert die (i-3) der Flusssäule und wird für jede "Ereignis" -Gruppe dieselbe BF sein. In Zeile 5 ist der Wert von "BF" beispielsweise 39, was der vorherige dritte Wert der Flussspalte (Fluss für Zeile 2) für alle "2" in der Ereignisspalte ist. Das Problem ist, dass BF [i] nicht größer als flow [i] sein kann. Wenn BF [i] größer als Fluss [i] ist, sollte der BF der (i-4) oder (i-5) oder (1-6) ... des Flusses sein, bis BF [i] gleich ist oder kleiner als Durchfluss [i]. In Zeile 10 ist beispielsweise der Wert der Spalte "BF" größer als der Wert der Spalte "flow". Daher ist der Wert von BF_1 (Spalte, die ich erstellen möchte) in Zeile 10 37, was den nächstniedrigeren Wert darstellt Durchflusswert, in diesem Fall der Durchfluss [i-6].
Als Beispiel haben wir den folgenden Datenrahmen:
flow<- c(40, 39, 38, 37, 50, 49, 46, 44, 43, 45, 40, 30, 80, 75, 50, 55, 53, 51, 49, 100)
event<- c(1,1,1,1,2,2,2,2,2,3,3,3,4,4,4,5,5,5,5,6)
BF<- c(NA, NA, NA, NA, 39, 39, 39, 39, 39, 46, 46, 46, 45, 45, 45, 80, 80, 80, 80, 53)
a<- data.frame(flow, event, BF)
Dies ist die Wunschausgabe, die ich suche. Ich möchte die Spalte BF_1 erstellen.
flow event BF BF_1
1 40 1 NA NA
2 39 1 NA NA
3 38 1 NA NA
4 37 1 NA NA
5 50 2 39 39
6 49 2 39 39
7 46 2 39 39
8 44 2 39 39
9 43 2 39 39
10 45 3 46 37
11 40 3 46 37
12 30 3 46 37
13 80 4 45 45
14 75 4 45 45
15 50 4 45 45
16 55 5 80 30
17 53 5 80 30
18 51 5 80 30
19 49 5 80 30
20 100 6 53 53
Gibt es eine Möglichkeit, die Spalte BF_1 zu generieren? Bitte lassen Sie mich Ihre Gedanken wissen. Ich arbeite mit for-Schleifen und verwende if-Bedingungen, kann jedoch den BF-Wert nicht für die gesamte Gruppe der Ereignisspalte halten.
Codierung ein bisschen ineffizient, könnte dplyr etc .. verwenden, aber es wird die Arbeit erledigen und mit der angegebenen BF_1
Spalte übereinstimmen
flow <- c(40, 39, 38, 37, 50, 49, 46, 44, 43, 45, 40, 30, 80, 75, 50, 55, 53, 51, 49, 100)
event <- c(1,1,1,1,2,2,2,2,2,3,3,3,4,4,4,5,5,5,5,6)
BF <- c(NA, NA, NA, NA, 39, 39, 39, 39, 39, 46, 46, 46, 45, 45, 45, 80, 80, 80, 80, 53)
a <- data.frame(flow, event, BF)
a$BF_1 <- NA #default to NA first
for(i in 1:length(unique(a$event))){
if(is.na(a[a$event == i, "BF"][1])) next
if(a[a$event == i, "BF"][1] < a[a$event == i, "flow"][1]) a[a$event == i, "BF_1"] <- a[a$event == i, "BF"][1]
if(a[a$event == i, "BF"][1] > a[a$event == i, "flow"][1]) {
head <- min(which(a$event==i))-6
if (min(head-6) < 0) head <- 1 #making sure it doesn't overflow to row 0
a[a$event == i, "BF_1"] <- min( a[ head:min(which(a$event==i)), "flow"] ) #fill the min of the subset flow column given position
}
}
a
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen