2016-12-09 3 views
0

Ich bin noch neu in R und möchte eine * ply-Funktion verwenden, um Informationen aus einem Datenrahmen zu extrahieren. Eine Probe Eingangsdatenrahmen sieht wie folgt aus:Verwenden Sie daply mit Multi-Variable-Funktion

# Construct the dataframe 
season <- c("12","12","12","12","12") 
hometeam <- c("Team A","MyTeam","MyTeam","Team D","Team E") 
awayteam <- c("MyTeam","Team B","Team C","MyTeam","MyTeam") 
score <- c("1 - 1","7 - 1","0 - 0","0 - 2","0 - 1") 
stats <- data.frame(season,hometeam,awayteam,score) 
print(stats) 


    season hometeam awayteam score 
1 11/12 Team A MyTeam 1 - 1 
2 11/12 MyTeam Team B 7 - 1 
3 11/12 MyTeam Team C 0 - 0 
4 11/12 Team D MyTeam 0 - 2 
5 11/12 Team E MyTeam 0 - 1 

Was ich tun möchte, ist extrahieren sowohl die Gegner von ‚MyTeam‘ sowie den Sieger. Der Punktestand wird immer als der Punktestand der Heimmannschaft gegen den Punktestand der Auswärtsmannschaft angegeben. Ich habe einen Weg zu extrahieren, wer der Gegner so ist:

Aber ich bin stecken stecken versucht, den Gewinner jedes Spiels zu bekommen. Ich habe versucht, dies zu tun mit daply() und einer benannte Funktion wie so:

# Separate out scores for home and away team to determine winner 
stats <- separate(stats, score, c('homescore','awayscore'), sep=' - ', remove=TRUE) 

# Function for use in ply to get the winner of a match 
determineWinner <- function(homescore, awayscore, hometeam) { 
    homewon <- FALSE 
    if (homescore < awayscore) { 
    homewon <- FALSE 
    } else if (homescore > awayscore) { 
    homewon <- TRUE 
    } else { 
    return("tie") 
    } 
    if (hometeam == "MyTeam") { 
    ifelse(homewon, return("won"), return("lost")) 
    } else { 
    ifelse(homewon, return("lost"), return("won")) 
    } 
}#end of function 

winner <- daply(stats, .(homescore,awayscore,hometeam), determineWinner(stats$homescore, stats$awayscore, stats$hometeam)) 

Aber dies ist eindeutig nicht. Teste ich die Methode daply() falsch? Ich bin mir immer noch nicht sicher, wie sich die * Funktionen wirklich verhalten. Es scheint, als ob eine * ply-Funktion der Weg dorthin ist, aber wenn es andere Lösungen gibt, bin ich ganz Ohr. Jede Hilfe wird sehr geschätzt!

Antwort

3

Ihre Logik kann ifelse mit verschachtelten implementiert werden:

winner <- ifelse(stats$homescore > stats$awayscore, 
      ifelse(stats$hometeam == "MyTeam","won","lost"), 
      ifelse(stats$homescore < stats$awayscore, 
        ifelse(stats$hometeam == "MyTeam","lost","won"), 
        "tie")) 
##[1] "tie" "won" "tie" "won" "won" 
+0

Ack. Ich hätte darüber nachdenken sollen! Prost Freund. –