2017-05-23 4 views
0

Ich bin ein absoluter R-Anfänger, der hier an einem Master-Projekt arbeitet.Unterschiedliche Altersberechnung für verschiedene Zeilen

Ich habe einen data.frame, der Informationen über Trabpferde enthält (ihre Gewinne, Einnahmen, Zeitaufzeichnungen und so). Die Daten sind so organisiert, dass jede Zeile Informationen für ein bestimmtes Jahr enthält, an dem das Pferd teilgenommen hat, und eine erste Zeile für jedes Pferd von "Total" enthält. Es gibt also eine Zusammenfassung für jede Variable für ihr gesamtes konkurrierendes Leben. Es sieht wie folgt aus:

travdata$Age<-age_calc(as.Date(travdata$Birth.date), enddate=as.Date("2016-12-31"), 
         units="years") 

ohne Probleme:

Data example ich eine neue Variable mit ihrem Alter mit der age_calc Funktion im eeptools Paket erstellt. Ich versuche herauszufinden, ob ich das Alter der Pferde für jedes bestimmte Jahr berechnen kann. Ich habe Informationen über sie. Das heißt, die "Total" -Reihe hätte ihr Alter bis 2016-12- 31, für das Jahr 2015 würde es zu diesem Zeitpunkt sein Alter haben und so weiter. Ich habe versucht, if-Anweisungen in age_calc einzubinden, aber es wird nicht funktionieren, und ich weiß wirklich nicht, wie ich das am besten machen soll.

Jede Literatur oder Hilfe, auf die Sie mich hinweisen könnten, wäre viel, sehr geschätzt.

MWE

travdata <- data.frame(
    "Id.Number"=c(rep("1938-98",3),rep("1803-97",7),rep("1221-03",4)), 
    "Name"=c(rep("Muuttuva",3),rep("Pelson Poika",7),rep("Muusan Muisto",4)), 
    "Sex"=c(rep("Mare",3),rep("Gelding",7),rep("Gelding",4)), 
    "Birth.year"=c(rep(1998,3),rep(1997,7),rep(2003,4)), 
    "Birth.date"=c(rep("1998-07-01",3),rep("1997-07-14",7),rep("2003-05-07",4)), 
    "Competition.year" = c("Total",2005,2004,"Total",2003,2004,2006,2005,2002,2001,2008,2010,"Total",2009), 
    "starts"=c(20,11,9,44,21,6,7,5,3,2,1,1,4,2), 
    "X1st.placements"=c(0,0,0,3,3,0,0,0,0,0,0,0,0,0), 
    "X2nd.placements"=c(2,2,0,1,0,1,0,0,0,0,0,0,0,0), 
    "X3rd.placements"=c(2,2,0,1,1,0,0,0,0,0,0,0,0,0), 
    "Earnings.euro"=c(1525,1425,100,2078,1498,580,0,0,0,0,0,0,10,10) 
) 
+3

Willkommen bei Stackoverflow angeben. Bitte werfen Sie einen Blick auf diese Tipps, wie Sie ein [minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) erstellen können, sowie auf diesen Post zu [ein großartiges Beispiel in R erstellen] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). – lmo

+3

Ich würde diese Daten sauber halten und die gesamte Zeile löschen, Sie können die Summen später mit 'dplyr :: group_by' leicht zurückholen oder Sie können diese Zeilen einfach in eine neue Tabelle verschieben. Wenn Sie Hilfe benötigen, verwenden Sie bitte 'dput (head (travdata, 10))' und fügen Sie die Ergebnisse in Ihre Frage ein. Dies wird ein minimales Beispiel für jemanden schaffen, mit dem man beginnen kann. –

Antwort

0

Der Trick besteht darin, die "Total" Reihen heraus zu filtern und ein Format für die as.Date() Funktion

library(eeptools) 
travdata <- data.frame(
    "Id.Number"=c(rep("1938-98",3),rep("1803-97",7),rep("1221-03",4)), 
    "Name"=c(rep("Muuttuva",3),rep("Pelson Poika",7),rep("Muusan Muisto",4)), 
    "Sex"=c(rep("Mare",3),rep("Gelding",7),rep("Gelding",4)), 
    "Birth.year"=c(rep(1998,3),rep(1997,7),rep(2003,4)), 
    "Birth.date"=c(rep("1998-07-01",3),rep("1997-07-14",7),rep("2003-05-07",4)), 
    "Competition.year" = c("Total",2005,2004,"Total",2003,2004,2006,2005,2002,2001,2008,2010,"Total",2009), 
    "starts"=c(20,11,9,44,21,6,7,5,3,2,1,1,4,2), 
    "X1st.placements"=c(0,0,0,3,3,0,0,0,0,0,0,0,0,0), 
    "X2nd.placements"=c(2,2,0,1,0,1,0,0,0,0,0,0,0,0), 
    "X3rd.placements"=c(2,2,0,1,1,0,0,0,0,0,0,0,0,0), 
    "Earnings.euro"=c(1525,1425,100,2078,1498,580,0,0,0,0,0,0,10,10) 
) 

travdata$Age<-age_calc(as.Date(travdata$Birth.date), 
         enddate=as.Date("2016-12-31"), units="years") 

competitions <- travdata[travdata$Competition.year!="Total",] 
competitions$Competition.age<-age_calc(
       as.Date(competitions$Birth.date), 
       enddate=as.Date(competitions$Competition.year, format="%Y"), 
       units="years",F) 
+1

Ja das war es! Danke Danke!! Dieses Format, das an den Code angepasst wurde, war, was mir fehlte, denke ich. Ich werde es für die Zukunft im Hinterkopf behalten :) –

+0

Hey @rgunning! Nochmals vielen Dank für Ihre Hilfe beim letzten Mal. Ich gehe zu diesem Code über, weil ich eine andere Altersvariable, 'Real.age', in Monate umwandeln möchte und jetzt funktioniert nicht nur dieser alte Code von dir nicht, nichts ist! (Ich habe das Skript gespeichert, wie ich meinen aktuellen Datensatz erstellt habe). Dies habe ich für die 'Real.age'-Variable getan: ' Data_year $ Real.age <-age_calc (as.Date (Data_year $ Geburtsdatum), enddate = as.Date (Data_year $ Competition.year, format = "% Y"), Einheiten = "Jahre", F) '. Ich habe versucht, die letzten eyars auf Monate zu ändern, und alles, was es sagt, ist, dass ein Ursprung geliefert werden muss. Sogar für deinen Code! Hilfe? –

+0

@LauraBas seltsam, dass es nicht für Sie arbeiten wird. das Tauschen von 'units =" years "' zu 'units =" monates "sollte funktionieren. Sehen Sie sich 'as.Date (Data_year $ Birth.date)' und 'as.Date (Data_year $ Competition.year, format ="% Y ")' an, um sicherzustellen, dass alle Werte Daten haben. Die age_calc-Funktion kommt mit NaN-Werten nicht gut zurecht. – rgunning

Verwandte Themen