2017-02-09 2 views
1

나는 야구 데이터 세트에서 일하고 있어요 : 각 팀이 표시되는 첫 해를 찾기 위해, 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'를로드하지만 전혀 사용하지 않는 팀에서 가장 긴 시간 동안 재생 플레이어의 이름을 제공 최대 행으로 idnames를 얻을. 나는'plyr' 기능을 정말로 필요로하지 않는 한'dplyr' 만 사용하는 것을 권장합니다. – Gregor

+0

@Gregor 나는 '야구'데이터 세트가 '플라이' – 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. 첫째, 팀은 선수의 수는 독특한 id의의
  2. 가져 오기 길이를 나타납니다 첫 해에 같은
  3. 각 그룹에 대해
  4. 얻기 최소 해 서로 다른 그룹으로 팀에 의해 분할 팀
  5. 분할 각 id에 의해 하위 그룹으로 그룹의 경우 팀
  6. 에서 플레이어가 재생 최대 기간을 줄 것이다 최대 행 수를 얻기에 각 하위 그룹은