2017-08-31 15 views
0

私はRのスキルに取り組んでいます。可能であれば、dplyrパッケージを使用してこの問題を解決したいと思います。グループ平均を計算し、グループに基づいて遅れをとります。

私はファンタジーフットボール統計のデータセットを持っています。各記録は、その週にプレイしたファンタジーのサッカーポイントを含め、シーズンの1試合(週)のプレーヤーの統計です。ここで

は、私が働いているデータの抜粋です:

  Player Week year Fantasy.Points Avg.Fantasy.Ponts 
1 Aaron Hernandez  1 2011   16.3   9.678571 
2 Aaron Hernandez  2 2011   12.2   9.678571 
3 Aaron Hernandez  5 2011   5.6   9.678571 
4 Aaron Hernandez  6 2011   10.8   9.678571 
5 Aaron Hernandez  8 2011   7.1   9.678571 
6 Aaron Hernandez  9 2011   9.5   9.678571 
7 Aaron Hernandez 10 2011   4.1   9.678571 
8 Aaron Hernandez 11 2011   4.4   9.678571 
9 Aaron Hernandez 12 2011   6.2   9.678571 
10 Aaron Hernandez 13 2011   4.3   9.678571 
11 Aaron Hernandez 14 2011   8.4   9.678571 
12 Aaron Hernandez 15 2011   20.5   9.678571 
13 Aaron Hernandez 16 2011   3.7   9.678571 
14 Aaron Hernandez 17 2011   22.4   9.678571 
15 Aaron Hernandez  1 2012   12.4   8.755556 
16 Aaron Hernandez  6 2012   9.0   8.755556 
17 Aaron Hernandez  7 2012   5.4   8.755556 
18 Aaron Hernandez 12 2012   3.6   8.755556 
19 Aaron Hernandez 13 2012   9.7   8.755556 
20 Aaron Hernandez 14 2012   17.8   8.755556 

フィールドAvg.Fantasy.Pointsプレイヤーがそのレコードに年間価値があった点の平均数です。たとえば、Aaron Hernandezは、2011年シーズンに平均9.678571ポイント、2012シーズンに8.755556ポイントの価値があった。

私は、プレーヤーが前年のの価値があった平均ポイント数の列を計算することに興味があります。上記の例では、2012年のAaron Hernandezの記録は、前年の平均が9.68571ポイントであることを示す必要があります。

答えて

1

SQLのサブクエリに似た回避策が見つかりました。

セイdf_teは、上記のスニペットからのデータフレームである:あなたがdplyrパッケージを使用しているので

df_te %>% 
    left_join(
     mutate(next.year = year + 1) %>% #add a column for the next year 
     group_by(Player, year) %>% 
     mutate(Previous.Avg.Fantasy.Points = first(Avg.Fantasy.Points) %>% #Copy of 'Avg.Fantasy.Points' column, with the name I'd like to have for new column 
     filter(row_number() == 1) %>% #Only keep one row per player/year group to avoid duplication upon join 
     select(Player, next.year, Previous.Avg.Fantasy.Points) #keep only columns I'd like to join in 
    by = c("Player" = "Player", "year" = "next.year") #By joining 'year' on LHS table with 'next.year' on RHS table, can get the previous year's average points.  
) 
0

、私はlag機能の使用を紹介したいと思います。与えられた行数の値をシフトすることができます。デフォルトは1です。最後の行select(c(colnames(dt), "Pre.Avg.Fantasy.Ponts"))は、列の順序を調整するためのものです。 dt2が最終出力です。

library(dplyr) 

dt2 <- dt %>% 
    group_by(Player, year) %>% 
    summarise(Avg.Fantasy.Ponts = first(Avg.Fantasy.Ponts)) %>% 
    mutate(Pre.Avg.Fantasy.Ponts = lag(Avg.Fantasy.Ponts)) %>% 
    select(-Avg.Fantasy.Ponts) %>% 
    right_join(dt, by = c("Player", "year")) %>% 
    select(c(colnames(dt), "Pre.Avg.Fantasy.Ponts")) 

データ

dt <- read.table(text = "   Player Week year Fantasy.Points Avg.Fantasy.Ponts 
1 'Aaron Hernandez'  1 2011   16.3   9.678571 
       2 'Aaron Hernandez'  2 2011   12.2   9.678571 
       3 'Aaron Hernandez'  5 2011   5.6   9.678571 
       4 'Aaron Hernandez'  6 2011   10.8   9.678571 
       5 'Aaron Hernandez'  8 2011   7.1   9.678571 
       6 'Aaron Hernandez'  9 2011   9.5   9.678571 
       7 'Aaron Hernandez' 10 2011   4.1   9.678571 
       8 'Aaron Hernandez' 11 2011   4.4   9.678571 
       9 'Aaron Hernandez' 12 2011   6.2   9.678571 
       10 'Aaron Hernandez' 13 2011   4.3   9.678571 
       11 'Aaron Hernandez' 14 2011   8.4   9.678571 
       12 'Aaron Hernandez' 15 2011   20.5   9.678571 
       13 'Aaron Hernandez' 16 2011   3.7   9.678571 
       14 'Aaron Hernandez' 17 2011   22.4   9.678571 
       15 'Aaron Hernandez'  1 2012   12.4   8.755556 
       16 'Aaron Hernandez'  6 2012   9.0   8.755556 
       17 'Aaron Hernandez'  7 2012   5.4   8.755556 
       18 'Aaron Hernandez' 12 2012   3.6   8.755556 
       19 'Aaron Hernandez' 13 2012   9.7   8.755556 
       20 'Aaron Hernandez' 14 2012   17.8   8.755556", 
       header = TRUE, stringsAsFactors = FALSE) 
関連する問題