【问题标题】:Grouping within group in R, plyr/dplyrR中的组内分组,plyr / dplyr
【发布时间】:2017-02-09 17:18:39
【问题描述】:

我正在研究棒球数据集:

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

【问题讨论】:

  • 您加载了plyr,但根本没有使用它。我建议只使用dplyr,除非你真的需要plyr 功能。
  • @Gregor 我认为baseball 数据集来自plyr

标签: r dplyr plyr


【解决方案1】:

也许这有帮助

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

【讨论】:

    【解决方案2】:

    我尝试使用 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,其中的行数最多,其中给出了在该团队中出场时间最长的球员的姓名

    【讨论】:

      猜你喜欢
      • 2012-07-02
      • 1970-01-01
      • 2016-04-18
      • 2015-01-08
      • 2015-02-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-16
      • 1970-01-01
      相关资源
      最近更新 更多