2016-10-26 4 views
0

관련 데이터가 포함 된 두 개의 데이터 프레임이 있습니다. 그것은 NFL과 관련이 있습니다. 하나 DF는 일주일에 의해 선수의 이름과 수신 대상 (플레이어 DF)가 :R : 두 개의 다른 데이터 프레임에서 새 데이터 프레임을 만드는 방법

  Player Tm Position 1 2 3 4 5 6 
1  A.J. Green CIN  WR 13 8 11 12 8 10 
2 Aaron Burbridge SFO  WR 0 1 0 2 0 0 
3 Aaron Ripkowski GNB  RB 0 0 0 0 0 1 
4 Adam Humphries TAM  WR 5 8 12 4 2 0 
5 Adam Thielen MIN  WR 5 5 4 3 8 0 
6 Adrian Peterson MIN  RB 2 3 0 0 0 0 

다른 데이터 프레임이 각 주에 팀에 의해 표현하는 목표를 잡 (팀 DF) : 내가 무엇

 Tm `1` `2` `3` `4` `5` `6` 
    <fctr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 
1  ARI 37 35 50 45 26 35 
2  ATL 38 34 30 37 28 41 
3  BAL 32 45 40 51 47 48 
4  BUF 22 30 20 33 20 26 
5  CAR 31 39 36 47 28 46 
6  CHI 28 29 45 36 41 49 
7  CIN 30 54 28 31 39 31 
8  CLE 26 33 38 38 35 42 
9  DAL 43 30 24 32 24 27 
10 DEN 26 32 35 31 34 47 
# ... with 22 more rows 

플레이어가 목표 백분율을 포함하는 다른 데이터 프레임을 주 단위로 작성하는 것입니다. 따라서 플레이어 df의 "Tm"열과 팀의 주 열 머리글 (1-6)의 팀을 일치시켜야합니다.

나는 새 행을 만들기 다음으로 병합하고이 작업을 수행하지만 더 많은 데이터 (주)를 추가로 좀 더 코드를 작성해야하는 방법을 알아 낸 : 그래서

a <- merge(playertgt, teamtgt, by="Tm") #merges the two 
    a$Wk1 <- a$`1.x`/a$`1.y` 
    a$Wk2 <- a$`2.x`/a$`2.y` 
    a$Wk3 <- a$`3.x`/a$`3.y` 

내가 찾던를 이 작업을 자동으로 업데이트 할 수있는 좋은 방법이며 필요하지 않은 열이있는 df를 만들지 않아도되며 새 소스 코드를 소스 데이터에 추가 할 때 업데이트됩니다.

다른 답변이 있으면 사과 드리 겠지만 지금은 좋은 방법을 찾고 있습니다. 찾을 수 없습니다. 도와 주셔서 미리 감사드립니다.

답변

2

당신은 dplyr으로이 작업을 수행 할 수 있습니다

library(dplyr) 
## Do a left outer join to match each player with total team targets 
a <- left_join(playertgt,teamtgt, by="Tm") 
## Compute percentage over all weeks selecting player columns ending with ".x" 
## and dividing by corresponding team columns ending with ".y" 
tgt.pct <- select(a,ends_with(".x"))/select(a,ends_with(".y")) 
## set the column names to week + number 
colnames(tgt.pct) <- paste0("week",seq_len(ncol(teamtgt)-1)) 
## construct the output data frame adding back the player and team columns 
tgt.pct <- data.frame(Player=playertgt$Player,Tm=playertgt$Tm,tgt.pct) 

을 분명히 난 단지 조인 후 열을 선택하는 ends_with의 편의를 위해 dplyr을 사용하고 있습니다. 이 선택을 할 grepl를 사용하는 기본-R의 접근 방식은 다음과 같습니다

a <- merge(playertgt, teamtgt, by="Tm", all.x=TRUE) 
tgt.pct <- subset(a,select=grepl(".x$",colnames(a)))/subset(a,select=grepl(".y$",colnames(a))) 
colnames(tgt.pct) <- paste0("week",seq_len(ncol(teamtgt)-1)) 
tgt.pct <- data.frame(Player=playertgt$Player,Tm=playertgt$Tm,tgt.pct) 

데이터 : 당신의 게시 제한 데이터 만 AJ 그린은 자신의 목표 비율을 계산해야합니다 :

playertgt <- structure(list(Player = structure(1:6, .Label = c("A.J. Green", 
"Aaron Burbridge", "Aaron Ripkowski", "Adam Humphries", "Adam Thielen", 
"Adrian Peterson"), class = "factor"), Tm = structure(c(1L, 4L, 
2L, 5L, 3L, 3L), .Label = c("CIN", "GNB", "MIN", "SFO", "TAM" 
), class = "factor"), Position = structure(c(2L, 2L, 1L, 2L, 
2L, 1L), .Label = c("RB", "WR"), class = "factor"), X1 = c(13L, 
0L, 0L, 5L, 5L, 2L), X2 = c(8L, 1L, 0L, 8L, 5L, 3L), X3 = c(11L, 
0L, 0L, 12L, 4L, 0L), X4 = c(12L, 2L, 0L, 4L, 3L, 0L), X5 = c(8L, 
0L, 0L, 2L, 8L, 0L), X6 = c(10L, 0L, 1L, 0L, 0L, 0L)), .Names = c("Player", 
"Tm", "Position", "X1", "X2", "X3", "X4", "X5", "X6"), class = "data.frame", row.names = c(NA, 
-6L)) 
##   Player Tm Position X1 X2 X3 X4 X5 X6 
##1  A.J. Green CIN  WR 13 8 11 12 8 10 
##2 Aaron Burbridge SFO  WR 0 1 0 2 0 0 
##3 Aaron Ripkowski GNB  RB 0 0 0 0 0 1 
##4 Adam Humphries TAM  WR 5 8 12 4 2 0 
##5 Adam Thielen MIN  WR 5 5 4 3 8 0 
##6 Adrian Peterson MIN  RB 2 3 0 0 0 0 

teamtgt <- structure(list(Tm = structure(1:10, .Label = c("ARI", "ATL", 
"BAL", "BUF", "CAR", "CHI", "CIN", "CLE", "DAL", "DEN"), class = "factor"), 
    X1 = c(37L, 38L, 32L, 22L, 31L, 28L, 30L, 26L, 43L, 26L), 
    X2 = c(35L, 34L, 45L, 30L, 39L, 29L, 54L, 33L, 30L, 32L), 
    X3 = c(50L, 30L, 40L, 20L, 36L, 45L, 28L, 38L, 24L, 35L), 
    X4 = c(45L, 37L, 51L, 33L, 47L, 36L, 31L, 38L, 32L, 31L), 
    X5 = c(26L, 28L, 47L, 20L, 28L, 41L, 39L, 35L, 24L, 34L), 
    X6 = c(35L, 41L, 48L, 26L, 46L, 49L, 31L, 42L, 27L, 47L)), .Names = c("Tm", 
"X1", "X2", "X3", "X4", "X5", "X6"), class = "data.frame", row.names = c(NA, 
-10L)) 
## Tm X1 X2 X3 X4 X5 X6 
##1 ARI 37 35 50 45 26 35 
##2 ATL 38 34 30 37 28 41 
##3 BAL 32 45 40 51 47 48 
##4 BUF 22 30 20 33 20 26 
##5 CAR 31 39 36 47 28 46 
##6 CHI 28 29 45 36 41 49 
##7 CIN 30 54 28 31 39 31 
##8 CLE 26 33 38 38 35 42 
##9 DAL 43 30 24 32 24 27 
##10 DEN 26 32 35 31 34 47 

을 결과입니다 :

##   Player Tm  week1  week2  week3  week4  week5  week6 
##1  A.J. Green CIN 0.4333333 0.1481481 0.3928571 0.3870968 0.2051282 0.3225806 
##2 Aaron Burbridge SFO  NA  NA  NA  NA  NA  NA 
##3 Aaron Ripkowski GNB  NA  NA  NA  NA  NA  NA 
##4 Adam Humphries TAM  NA  NA  NA  NA  NA  NA 
##5 Adam Thielen MIN  NA  NA  NA  NA  NA  NA 
##6 Adrian Peterson MIN  NA  NA  NA  NA  NA  NA 
2

당신이 훨씬 더 쉽게 살 만드는, 데이터를 다음 약간의 시간을 제공하는 경우가 좋은 것입니다.

데이터 구조가 주요 포인트라고 생각합니다. 데이터를 긴 형식으로 저장해야한다고 생각합니다 (키워드는 깔끔한 데이터입니다). 나는 약간의 자료를 만들었고 나는 당신의 문제를 정확하게 이해할 수 있기를 바란다. 지금

player_df = gather(player_df, week, player_value, -team, -player) 
team_df = gather(team_df, week, team_value, -team) 

> player_df 
    team player week player_value 
1 ARI  A X1   15 
2 BAL  B X1   16 
3 BAL  C X1   13 
4 CLE  D X1   14 
5 CLE  F X1   12 
6 ARI  A X2   10 
7 BAL  B X2   15 
8 BAL  C X2   11 
9 CLE  D X2   19 
10 CLE  F X2   14 
> team_df 
    team week team_value 
1 ARI X1  281 
2 BAL X1  362 
3 CLE X1  323 
4 ARI X2  205 
5 BAL X2  309 
6 CLE X2  238 

가입 (또는 병합)들을 함께 :

library(tidyr) 
library(dplyr) 


player_df = data.frame(team = c('ARI', 'BAL', 'BAL', 'CLE', 'CLE'), 
         player =c('A', 'B', 'C', 'D', 'F'), 
         '1' = floor(runif(5, min=1, max=2)*10), 
         '2' = floor(runif(5, min=1, max=2)*10)) 
> player_df 
    team player X1 X2 
1 ARI  A 15 10 
2 BAL  B 16 15 
3 BAL  C 13 11 
4 CLE  D 14 19 
5 CLE  F 12 14 

team_df = data.frame(team = c('ARI', 'BAL', 'CLE'), 
         '1' = floor(runif(3, min=10, max=20)*20), 
         '2' = floor(runif(3, min=10, max=20)*20)) 
> team_df 
    team X1 X2 
1 ARI 281 205 
2 BAL 362 309 
3 CLE 323 238 

지금, 긴 형식으로 모두 dataframes을 넣어. inner_join은 기본적으로 공통 열 이름에 결합합니다.

join_db = inner_join(player_df, team_df) 
> join_db 
    team player week player_value team_value 
1 ARI  A X1   15  281 
2 BAL  B X1   16  362 
3 BAL  C X1   13  362 
4 CLE  D X1   14  323 
5 CLE  F X1   12  323 
6 ARI  A X2   10  205 
7 BAL  B X2   15  309 
8 BAL  C X2   11  309 
9 CLE  D X2   19  238 
10 CLE  F X2   14  238 

나는 더 많은 것을 할 수 있다고 생각합니다.

HTH

스테판

관련 문제