在 R 中分组,plyr/dplyr

Grouping within group in 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) 为相关球队效力的最长年限。为此,我需要以某种方式在现有组(团队)中按玩家分组,并且 select 最大行数。我该怎么做?

也许这有帮助

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))

我试着用 base 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. 获取唯一 ids 的长度,即该团队中玩家的数量
  4. id 将每个组分成子组,并获得最大行数,这将给出该团队中一名球员的最长比赛时间
  5. 对于每个子组,获取 id 中具有最大行数的 names,该行给出了在该队中出场时间最长的球员的名字