2017-04-05 8 views
0

次の形式のデータフレームがあります。条件文を含む集計ローリング平均R

match team1 team2 winningTeam 
1  A  D  A 
2  B  E  E 
3  C  F  C 
4  D  C  C 
5  E  B  B 
6  F  A  A 
7  A  D  D 
8  D  A  A 

私がしたいのは、最後のxマッチでチーム1とチーム2の両方のフォームを計算する変数を作成することです。たとえば、team1_form_last3_matchesという変数を作成すると、一致8は0.33(最後の3つの一致のうち1つを獲得した)、チーム2_form_last3_matchesという変数があり、一致8の0.66になります最後の3試合のうち2試合)。理想的には私はチームX_form_last Y変数と自動的に作成されるこれらの変数を計算するときに考慮すべき以前のマッチの数を指定できるようにしたいと思います。私は、dplyr、動物園の平均的な機能とネストされたfor/ifステートメントのロードを使用して、たくさんのアプローチを試みました。しかし、私はそれをかなりクラックしていないし、確かにエレガントな方法ではありません。私はこの一般的な問題に対する単純な解決策が見当たりません。どんな助けでも大歓迎です!

乾杯、

ジャック

答えて

0

、あなたはT2のためにそれを複製する必要があります。

dat <- data.frame(match = c(1:8), team1 = c("A","B","C","D","E","F","A","D"), team2 = c("D","E","F","C","B","A","D","A"), winningTeam = c("A","E","C","C","B","A","D","A"),stringsAsFactors = FALSE) 

dat$t1l3 <- c(NA,sapply(2:nrow(dat),function(i) { 
    df <- dat[1:(i-1),] #just previous games, i.e. excludes current game 
    df <- df[df$team1==dat$team1[i] | df$team2==dat$team1[i],] #just those containing T1 
    df <- tail(df,3) #just the last three (or fewer if there aren't three previous games) 
    return(sum(df$winningTeam==dat$team1[i])/nrow(df)) #total wins/total games (up to three) 
})) 
+0

こんにちは。答えに戻ってくれてありがとう。私は今日、この構造の何かがうまくいくと考えていました。私は上記を試して、それはほとんど動作しますが、私のシナリオでは、私は、現在のゲームを除く最後の3試合の結果を得たかった - 私は上記が含まれると思いますか?また、なぜ上記のようにチームが発生した最初の2回のNAsを作成しないのでしょうか(最後の3つのフォームで計算するのに十分なデータがないためです)。再度、感謝します! –

+0

こんにちはジャック。上記のものは、現在のゲーム、すなわち 'dat [1:(i-1)、]'の項を除外すべきです。 'tail 'は指定された要素数までdata.frame(またはベクトルなど)の最後の部分を与えます。今度はあなたがそれを言及し、少数の場合は3つ前のゲームが3ではないことを除いてください! - 上記の改正。 –

0

どのようなものについて:これはt1l3のために働く

dat <- data.frame(match = c(1:8), team1 = c("A","B","C","D","E","F","A","D"), team2 = c("D","E","F","C","B","A","D","A"), winningTeam = c("A","E","C","C","B","A","D","A")) 
    match team1 team2 winningTeam 
1  1  A  D   A 
2  2  B  E   E 
3  3  C  F   C 
4  4  D  C   C 
5  5  E  B   B 
6  6  F  A   A 
7  7  A  D   D 
8  8  D  A   A 

Allteams <- c("A","B","C","D","E","F") 

# A vectorized function for you to use to do as you ask: 
teamX_form_lastY <- function(teams, games, dat){ 
    sapply(teams, function(x) { 
    games_info <- rowSums(dat[,c("team1","team2")] == x) + (dat[,"winningTeam"] == x) 
    lookup <- ifelse(rev(games_info[games_info != 0])==2,1,0) 
    games_won <- sum(lookup[1:games]) 
    if(length(lookup) < games) warning(paste("maximum games for team",x,"should be",length(lookup))) 
    games_won/games 
    }) 
} 

teamX_form_lastY("A", 4, dat) 
A 
0.75 

# Has a warning for the number of games you should be using 
teamX_form_lastY("A", 5, dat) 
A 
NA 
Warning message: 
    In FUN(X[[i]], ...) : maximum games for team A should be 4 

# vectorized input 
teamX_form_lastY(teams = c("A","B"), games = 2, dat = dat) 
A B 
0.5 0.5 

# so you ca do all teams 
teamX_form_lastY(teams = Allteams, 2, dat) 
A B C D E F 
0.5 0.5 1.0 0.5 0.5 0.0 
+0

以上更新の答えを参照してください。 –

+0

こんにちはエヴァン。返信いただきありがとうございます!これもうまくいきましたが、データフレームに直接値を出力するので、私はもう一方のソリューションを好んでいました。 –

+0

私はあなたに同意します。乾杯〜 –

関連する問題