2017-02-09 9 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 

Теперь я хочу, чтобы добавить столбец с указанием максимального количества лет любой игрок (идентификатор) играет для команды в вопросе. Для этого мне нужно как-то группировать игрока в пределах существующей группы (группы) и выбирать максимальное количество строк. Как мне это сделать?

+1

Вы загружаете 'plyr', но не использовать его вообще. Я бы рекомендовал придерживаться 'dplyr', только если вам действительно не нужны функции plyr. – Gregor

+0

@Gregor Я думаю, что набор данных 'baseball' от' 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. Для каждая подгруппа, получить names из id с максимальными рядами, которая дает имя игрока, который играл за долгое время в этой команде

 Смежные вопросы

  • Нет связанных вопросов^_^