2017-02-09 68 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与给出了在球队效力时间最长的球员的名字