2017-05-13 4 views
0

Ich habe einen Datenrahmen von Restaurant Inspektionen nach Datum sortiert. Für jede Beobachtung möchte ich zwei zusätzliche Variablen hinzufügen, um festzustellen, wie viele Gesamtinspektionen dieses Restaurant hatte und wie oft sie versagt haben. Ich möchte vermeiden, eine for-Schleife zu verwenden, aber ich weiß nicht, wie ich das sonst tun soll. Im Wesentlichen habe ich momentan einen Datenrahmen, der aus den ersten drei Spalten des Datenrahmens unten besteht, und ich möchte die letzten zwei Spalten hinzufügen.R Zunehmende Variable basierend auf früheren Vorkommen

Anfangsdatenrahmen

Restaurant_ID Date   Result 
    1    01/02/2011 Pass 
    2    02/05/2011 Pass 
    3    04/07/2011 Fail 
    1    09/05/2011 Fail 
    2    03/13/2012 Pass 
    1    08/25/2012 Fail 
    2    09/25/2012 Pass 
    3    01/05/2013 Pass 

Wunsch Ausgang 1

Restaurant_ID Date   Result total_inspect failed_inspect 
1    01/02/2011 Pass  1    0 
2    02/05/2011 Pass  1    0 
3    04/07/2011 Fail  1    1 
1    09/05/2011 Fail  2    1 
2    03/13/2012 Pass  2    0 
1    08/25/2012 Fail  3    2 
2    09/25/2012 Pass  3    0 
3    01/05/2013 Pass  2    1 

EDIT: Ich habe erkannt, dass ich will eigentlich die letzten beiden Spalten die Anzahl der insgesamt reflektieren und gescheiterte Kontrollen vor dem aktuelle Beobachtung. Also, was ich eigentlich will, ist

Wunsch Ausgang 2

Restaurant_ID Date   Result past_inspect past_failed_inspect 
    1    01/02/2011 Pass  0    0 
    2    02/05/2011 Pass  0    0 
    3    04/07/2011 Fail  0    0 
    1    09/05/2011 Fail  1    0 
    2    03/13/2012 Pass  1    0 
    1    08/25/2012 Fail  2    1 
    2    09/25/2012 Pass  2    0 
    3    01/05/2013 Pass  1    1 

Antwort

3

Diese Lösung verwendet Funktionen aus dem Paket tidyverse und lubridate.

# Create the example data frame 
dt1 <- read.csv(text = "Restaurant_ID,Date,Result 
1,01/02/2011,Pass 
2,02/05/2011,Pass 
3,04/07/2011,Fail 
1,09/05/2011,Fail 
2,03/13/2012,Pass 
1,08/25/2012,Fail 
2,09/25/2012,Pass 
       3,01/05/2013,Pass", 
       stringsAsFactors = FALSE) 

# Load packages 
library(tidyverse) 
library(lubridate) 

dt2 <- dt1 %>% 
    # Convert the Date column to Date class 
    mutate(Date = mdy(Date)) %>% 
    # Sort the data frame based on Restaurant_ID and Date 
    arrange(Restaurant_ID, Date) %>% 
    # group the data by each restaurant ID 
    group_by(Restaurant_ID) %>% 
    # Create a column showing total_inspect 
    mutate(total_inspect = 1:n()) %>% 
    # Create a column showing fail_result, fail is 1, pass is 0 
    mutate(fail_result = ifelse(Result == "Fail", 1, 0)) %>% 
    # Calculate the cumulative sum of fail_result 
    mutate(failed_inspect = cumsum(fail_result)) %>% 
    # Remove fail_result 
    select(-fail_result) %>% 
    # Sort the data frame by Date 
    arrange(Date) 

Edit: Berechnen Sie die Vergangenheit Inspektion und nicht zählen

dt3 <- dt2 %>% 
    mutate(past_inspect = ifelse(total_inspect == 0, 0, total_inspect - 1)) %>% 
    mutate(past_failed_inspect = ifelse(Result == "Fail" & failed_inspect != 0, 
             failed_inspect - 1, 
             failed_inspect)) %>% 
    select(-total_inspect, -failed_inspect) 
+0

Danke das ist genial! Ich wusste vorher nichts über das saubere Paket, also weiß ich es zu schätzen, dass Sie mich in diese Richtung weisen. Ich hatte gehofft, du könntest mir mit dem Schnitt helfen, den ich gerade hinzugefügt habe. Ich würde mir wünschen, dass die gesamten und nicht bestandenen Inspektionen die Inspektionen vor der aktuellen Beobachtung widerspiegeln. Zuerst dachte ich, ich könnte nur 1 von beiden Spalten abziehen, aber das funktioniert nicht für past_failed_inspect, wie in der letzten Zeile, wo failed_inspect und past_failed_inspect für Restaurant 3 gleich sind. – person10559

+1

@ person10559 Bitte beachten Sie mein Update. "dt3" ist der "Gewünschte Ausgang 2". – www

+0

Das war unglaublich hilfreich, vielen Dank! – person10559

Verwandte Themen