2017-12-05 2 views
0

I einen Datenrahmen aufweisen, wie folgt:Binning, Daten in r Gruppierungswerte unter Verwendung eines spezifischen Bereichs withing ein Ereignis zu bestimmen, oder für Überlebensanalyse verändern

df <- data.frame(as.date=c("14/06/2016","15/06/2016","16/06/2016","17/06/2016","18/06/2016","19/06/2016","20/06/2016","21/06/2016","22/06/2016","23/06/2016", 
        "24/06/2016","04/07/2016","05/07/2016","06/07/2016","07/07/2016","08/07/2016","09/07/2016","10/07/2016","11/07/2016","12/07/2016", 
        "13/07/2016","14/07/2016","15/07/2016","17/07/2016","18/07/2016","19/07/2016","20/07/2016","21/07/2016","22/07/2016","01/08/2016", 
        "02/08/2016","03/08/2016","04/08/2016","05/08/2016","06/08/2016","07/08/2016","08/08/2016","09/08/2016","10/08/2016","11/08/2016", 
        "12/08/2016","13/08/2016","14/08/2016","15/08/2016","16/08/2016","17/08/2016","18/08/2016","19/08/2016","20/08/2016","21/08/2016", 
        "22/08/2016","23/08/2016","24/08/2016","25/08/2016","26/08/2016","27/08/2016","28/08/2016","29/08/2016","30/08/2016","31/08/2016", 
        "01/09/2016","02/09/2016","03/09/2016","04/09/2016","05/09/2016","06/09/2016","07/09/2016","08/09/2016","09/09/2016","10/09/2016", 
        "11/09/2016","12/09/2016","13/09/2016","14/09/2016","15/09/2016","16/09/2016","17/09/2016","18/09/2016","19/09/2016","20/09/2016"), 
      wear=c("0","55","0","0","0","0","8","8","15","25","30","37","43","49","52","52","55","57","57","61","67","69","2","2","7", 
        "10","13","14","16","16","19","22","22","24","25","26","29","29","33","34","34","36","38","44","45","48","50","55", 
        "56","58","0","4","0","4","4","6","9","9","12","14","16","17","25","25","33","36","44","46","48","52","55","59", 
        "8","9","9","12","24","33","36","44")) 

der Daten ist ein Beispiel für Verschleißrate auf einem Typ von Metall auf einer Maschine, es steigt mit der Zeit fällt sie auf 0, ein Ereignis oder eine Änderung,

aber das Problem, das ich habe, ist, dass der Verschleiß Wert nicht auf 0 abfallen, wie Sie aus der Daten, gibt es 2 Variablen

as.date = Datum über Zeit, Verschleiß = Verschleiß von Metall auf einem Teil der Zeit

RANGE zwischen Änderungen sind: 55-0, 60-2 , 58-0, 59-8

, wenn es aus einem großen Tropfen Nummer 0 ist es leicht zu Code, ich verwende den folgenden Code, zu ändern und neue Variablen namens der Status & id

{Creates 2 new columns status & id 
prop.table(table(df$Status)) 
prop.table(table(df$Status),1) # creates new coulmn called status 
df$Status <- 0# fills in column status with all zeros 
df$Status[wear > -10 & wear == 0] <- 1 # fill in 1s when wear = 0 
prop.table(table(df$Status)) 
prop.table(table(df$Status),1) # creates new coulmn called status 
df$id <-1# fills in column status with '1's 

for(i in 2:nrow(df)){ 
    if(df$Status[i-1]==0){ 
    df$id[i]=df$id[i-1] 
    } 
    else { 
    df$id[i]=df$id[i-1]+1 
    } 
} 
} 

es einen Rückgang der Verschleißwerte auf 0 fangen funktioniert OK hinzuzufügen, aber wenn es isn‘ t, wie in den Datenbeispielen, die Verschleißabfälle von 55-0 stattfinden, 69-2, 58-0, 59-8, manchmal gibt es Fälle, in denen die Abnutzungswerte negativ sind, nicht sicher, ob dies richtig ist. Ich habe versucht, das Binning und die Gruppierung der Daten zu umgehen aber war erfolglos.

Dies ist ein Beispiel der Daten, der in der realen Datensatzes gibt es mehr als 100 Veranstaltungen, meist ein Verschleißwert Abfall auf 0, aber zwischen 10-20 Gelegenheiten entweder auf negative Werte fallen oder eine Werte < 10.

Antwort

0

Ich denke, for-Schleife ist ineffizient. Wir können so etwas mit dem dplyr und lubridate Paket machen.

library(dplyr) 
library(lubridate) 

df2 <- df %>% 
    # Convert the as.date column to date class 
    # Convert the wear column to numeric 
    mutate(as.date = dmy(as.date), 
     wear = as.numeric(as.character(wear))) %>% 
    # Create column show the wear of previous record 
    mutate(wear2 = lag(wear)) %>% 
    mutate(Diff = wear - wear2) 

Die Idee ist, die wear Spalte um 1, zu verschieben und dann die Differenz zwischen dem Verschleiß des Datums berechnen und dem vorherigen Zeitpunkt. Die Ergebnisse werden in der neuen Spalte als Diff gespeichert. So sieht der neue Datenrahmen aus.

head(df2) 
#  as.date wear wear2 Diff 
# 1 2016-06-14 0 NA NA 
# 2 2016-06-15 55  0 55 
# 3 2016-06-16 0 55 -55 
# 4 2016-06-17 0  0 0 
# 5 2016-06-18 0  0 0 
# 6 2016-06-19 0  0 0 

Danach kann man einen Schwellenwert in Diff definieren eine Ende einer Periode auszufiltern. Zum Beispiel habe ich hier den Schwellenwert -50 definiert. Sie können sehen, dass die filter Funktion erfolgreich vier Perioden identifiziert.

# Filter Diff <= -50 
df2 %>% filter(Diff <= -50) 
#  as.date wear wear2 Diff 
# 1 2016-06-16 0 55 -55 
# 2 2016-07-15 2 69 -67 
# 3 2016-08-22 0 58 -58 
# 4 2016-09-13 8 59 -51 

Eine letzte Anmerkung, in der ursprünglichen Datenrahmen, die wear Spalte ist in Faktor, aber Sie es als numerische Berechnung. Das ist gefährlich. Ich habe wear = as.numeric(as.character(wear)) verwendet, um die Spalte in numerisch zu konvertieren, aber es wäre großartig, wenn Sie die numerische Spalte an erster Stelle erstellen könnten.

+0

OK, bekommen, was Sie tun, aber manchmal kann der Verschleiß Wert so niedrig wie 45 und so hoch wie 78 nicht immer um 55 sein, wäre es besser, vielleicht 2 oder 3 Filter zu tun? nur darüber nachdenken, wie dies den Status ändern könnte –

+0

Natürlich können Sie entscheiden, welche Arten von Filterstrategie am besten Ihren Bedürfnissen entsprechen können. – www

Verwandte Themen