2017-07-11 3 views
0

Ich habe eine data.frame mit Informationen über die Rennleistung auf Pferden. Ich habe eine Variable Competition.year, die eine Zeile "Total" und dann eine Zeile für jedes Jahr das Pferd konkurriert hat. Ich habe auch eine Variable Competition.age, die das Alter der Pferde in jedem bestimmten Jahr, das sie konkurrierten, beschreibt.Datenrahmen-Teilmenge nach übereinstimmenden Werten in R

Ich versuche, eine Teilmenge df basierend auf ihren besten Rennzeiten und dem Alter, als sie es waren, zu schaffen. In der "Total" -Reihe ist die Rennzeit die beste. Also, ich muss herausfinden, wie R zu sagen ist, wenn die Rennzeit in Total row gleich ist, wann immer es ist, dass sie tatsächlich diese Zeit erreicht haben, das Alter eingeschlossen, dann waren sie dann im neuen Datenrahmen. Ich bin super neu in R, also habe ich keine Ahnung, wo ich überhaupt anfangen soll. Ich habe einige Sachen ausprobiert, die ich bei anderen Fragen gesehen habe, aber ich kann es nicht richtig machen. Jede Hilfe würde sehr geschätzt werden!

Mein sieht df wie folgt aus:

travdata <- data.frame(
"Name"=c(rep("Muuttuva",3),rep("Pelson Poika",7),rep("Muusan Muisto",4)), 
"Competition.year" = c("Total",2005,2004,"Total",2003,2004,2006,2005,2002,2001,2008,2010,"Total",2009), 
"Time.record.auto.start"=c(93.5,NA,93.5,96.5,NA,NA,104.2,96.5,NA,96.6,NA,NA,NA,NA), 
"Time.record.volt.start"=c(92.5,98.4,92.5,94.3,NA,105.3,98.3,94.3,102.1,99.1,107.5,NA,107.5,NA), 
"Competition.age"=c(NA,6,7,NA,4,5,6,7,8,9,NA,5,6,7)) 

Die df gewünschten 223 Zeilen haben sollte (da, dass die Gesamtmenge der Pferde ist, ich habe) mit Spalten Name, Competition.year=="Total", Time.record.auto.start, Time.record.volt.start und Competition.age

+1

Bitte machen Sie ein minimales Beispiel, um Ihr Problem zu visualisieren. Mit Beispiel und gewünschtem Ergebnis. –

+0

Ihr Beispieldatenrahmen ist problematisch. In der Spalte "Competition.age" werden 15 Beobachtungen simuliert, in allen anderen Spalten 14 Beobachtungen. Bitte beheben Sie das. – www

+0

Mögliches Duplikat von [Inner Join mit Bedingungen in R] (https://stackoverflow.com/questions/31179805/inner-join-with-conditions-in-r) – C8H10N4O2

Antwort

0

Zuerst musste ich Ihre Beispieldaten ändern, um sicherzustellen, dass alle 5 Variablen nur jeweils 14 Beobachtungen hatten. Ich tat dies, indem ich das letzte NA in der Competition.age Variable entfernte. Ich musste auch die 94.3 und 98.3 Werte in der Time.record.volt.start Variablen austauschen, so dass die Werte mit dem übereinstimmten, was in der Total Spalte für das Pferd mit Name gleich Pelson Poika erwartet wurde.

Hier die korrigierten Daten:

travdata <- data.frame(
"Name"=c(rep("Muuttuva",3),rep("Pelson Poika",7),rep("Muusan Muisto",4)), 
"Competition.year" = c("Total",2005,2004,"Total",2003,2004,2006,2005,2002,2001,2008,2010,"Total",2009), 
"Time.record.auto.start"=c(93.5,NA,93.5,96.5,NA,NA,104.2,96.5,NA,96.6,NA,NA,NA,NA), 
"Time.record.volt.start"=c(92.5,98.4,92.5,94.3,NA,105.3,98.3,94.3,102.1,99.1,107.5,NA,107.5,NA), 
"Competition.age"=c(NA,6,7,NA,4,5,6,7,8,9,NA,5,6,7)) 

Und hier ist eine einfache dplyr Lösung, die ich denke, das tut, was Sie wollen.

library(dplyr) 
df1 <- 
    travdata %>% group_by(Name) %>% filter(Competition.year == "Total") %>% select(Name, Time.record.auto.start, Time.record.volt.start) 
df2 <- travdata %>% filter(Competition.year != "Total") 
df3 <- 
    inner_join(
     df1, 
     df2, 
     by = c(
      "Name" = "Name", 
      "Time.record.auto.start" = "Time.record.auto.start", 
      "Time.record.volt.start" = "Time.record.volt.start" 
     ) 
    ) 

Der Datenrahmen df3 zurückkehren soll, was Sie nach waren.

+0

Hey! Vielen Dank für die Antwort und Entschuldigung für das fehlerhafte Schreiben des 'df', ich bin ein Super-Neuling in dieser Welt der Statistiken und des Code-Schreibens. Wenn ich richtig verstanden habe, was du gemacht hast, jetzt in "df3", sagt "Competition.year" mir das Jahr, in dem sie ihre beste Zeit erreicht haben und sie mit dem Alter übereinstimmen, in dem sie waren, oder? :) –

+0

@LauraBas Kein Problem, und ja, die Spalte 'Competition.year' in' df3' zeigt das Jahr, das in der Zeile 'Total' dieses Pferdes war. Beachten Sie, dass das dritte Pferd keine Altersdaten für das Jahr hatte, in dem es sein bestes Rennen gemacht hat. Wenn dies häufig in Ihren Daten passiert, könnten wir einen Weg finden, das Alter des besten Rennens manuell zu berechnen ein anderes Jahr, das das Alter hat. – meenaparam

+0

Hey! Der einzige Grund, warum ich denke, ist, dass ich das 'data.frame' Beispiel geschrieben habe; als ich es auf meine vollständigen Daten anwandte, funktionierte es perfekt.Ich habe eine Reihe von verschiedenen Alter Variablen mit dem 'eeptools' Paket basierend auf verschiedenen Bedingungen berechnet und sie alle gut funktionieren. Ich musste nur eine Vorstellung davon haben, in welchem ​​Alter sie normalerweise ihre besten Zeiten erreichen und das habe ich jetzt. Danke noch einmal!! –

Verwandte Themen