在R,plyr / dplyr中分组

时间:2017-02-09 17:18:40

标签: r dplyr plyr

我正在处理棒球数据集:

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)为相关团队所玩的最大年数。为此,我需要以某种方式按现有组(团队)内的玩家分组,并选择最大行数。我该怎么做?

2 个答案:

答案 0 :(得分: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 :(得分: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 s的长度,即该团队中的玩家数量
  4. id将每个组拆分为子组,并获取将为该团队中的玩家播放的最长持续时间的最大行数
  5. 对于每个子组,获取names的{​​{1}}最大行数,其中包含在该小组中播放时间最长的玩家的名称