2017-02-09 4 views
1

で、グループ内のグループ化:は、私は野球のデータセットに取り組んでいるR、plyr/dplyr

data(baseball, package="plyr") 
library(dplyr) 

baseball[,1:4] %>% head 
      id year stint team 
4 ansonca01 1871  1 RC1 
44 forceda01 1871  1 WS3 
68 mathebo01 1871  1 FW1 
99 startjo01 1871  1 NY2 
102 suttoez01 1871  1 CL1 
106 whitede01 1871  1 CL1 

まず私は、グループに各チームが表示された最初の年を見つけるためにチームによって設定されたデータが欲しいですこれまで各チームのために果たしている個別のプレーヤーの数:

baseball[,1:4] %>% group_by(team) %>% 
    summarise("first_year"=min(year), "num_distinct_players"=n_distinct(id)) 

# A tibble: 132 × 3 
    team first_year num_distinct_players 
    <chr>  <int>    <int> 
1 ALT  1884     1 
2 ANA  1997     29 
3 ARI  1998     43 
4 ATL  1966     133 
5 BAL  1954     158 

は今、私はすべてのプレイヤー(ID)が問題のチームのために果たしている年間の最大数を示す列を追加します。これを行うには、私は何とか既存のグループ(チーム)内のプレーヤーによってグループ化し、最大行数を選択する必要があります。これはどうすればいいですか?

+1

あなたは 'plyr'をロードしますが、まったくそれを使用していないそのチームで最も長い時間のために果たした選手の名前を与える最大の行でidnamesを取得します。本当に 'plyr'機能が必要な場合を除き、' dplyr'を使うことをお勧めします。 – Gregor

+0

@Gregor私は 'baseball'データセットが' plyr'からだと思います – akrun

答えて

4

おそらくこれは、

baseball %>% 
    select(1:4) %>% 
    group_by(id, team) %>% 
    dplyr::mutate(nyear = n_distinct(year)) %>% 
    group_by(team) %>% 
    dplyr::summarise(first_year = min(year), 
        num_distinct_players = n_distinct(id), 
        maxYear = max(nyear)) 
1

を助け、私は基本Rでこれをやってみましたし、これを思い付きました。それはかなり遅いです。

df = data.frame(t(sapply(split(baseball, baseball$team), function(x) 
        cbind( min(x$year), 
          length(unique(x$id)), 
          max(sapply(split(x,x$id), function(y) 
              nrow(y))), 
          names(which.max(sapply(split(x,x$id), function(y) 
              nrow(y)))))))) 

colnames(df) = c("Year", "Unique Players", "Longest played duration", 
              "Longest Playing Player") 
  1. グループごとに異なるグループ
  2. にチームによって分割まず、チームは選手の数あるユニークなid秒の
  3. 取得長を表示されたときに最初の年として、最低年取得そのチームの
  4. 各グループをサブグループに分割してidとし、そのチームのプレーヤーがプレイする最大継続時間を与える最大行数を取得してください。
  5. 各サブグループは、
関連する問題