2017-02-09 71 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'但不使用它在所有的最大行數。除非你真的需要'plyr'功能,否則我建議只使用'dplyr'。 – Gregor

+0

@Gregor我認爲'棒球'數據集來自'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. 對於每個組,得到最小的一年,第一年當球隊出現
  3. 的獨特id小號獲取長度爲玩家的數量在該球隊中
  4. 將每個球隊拆分爲id,並獲得該球隊中球員最長持續時間的最大行數
  5. 每個小組獲得idnames與給出了在球隊效力時間最長的球員的名字