2014-07-20 2 views
1

ddply를 사용하여 데이터를 정규화하려고합니다 ('season'변수로 하위 집합).하지만 데이터의 앞부분에 시즌 변수를 삽입하고 있습니다 (열 4). 모든 데이터는 오른쪽에 있습니다.ddply 내 데이터를 재정렬합니다

저는 dplyr/plyr 세계에 처음 왔기 때문에 어떤 도움을 주시면 감사하겠습니다.

완전 재현 예 :

library(plyr) 
library(dplyr) 
library(XML) 
library(stringr) 

# File Names, Functions, Parameters, etc. 
# custom functions 
normalize <- function(x) { 
    return((x - min(x))/(max(x) - min(x))) 
} 

trim <- function (x) gsub("^\\s+|\\s+$", "", x) 

first_season <- 2004 
last_season <- 2013 
num_seasons <- as.numeric(last_season - first_season + 1) 

seasons <- seq(first_season, last_season, by=1) 
rm(first_season, last_season) 

# Passing 
passing <- data.frame() 
for (i in 1:num_seasons) { 
    url <- paste("http://www.pro-football-reference.com/years/", seasons[i],"/passing.htm", sep = "") 
    df <- readHTMLTable(url,which=1) 
    df$season = seasons[i] 
    df <- df[!names(df) %in% c("QBrec") ] 
    if(df$season >= 2008) df <- df[!names(df) %in% c("QBR") ] # Removes QBR 2008+ 
    passing <- rbind(passing, df) 
    rm(df) 
    print(seasons[i]) 
} 

names(passing) <- c("rank_pfr", "nameinfo", "team", "age", "games", "games_started", 
        #"qb_record", 
        "completions", "attempts", "comp_pct", "yards_passing", 
        "td_passing", "td_pct", "interceptions", "int_pct", "long_passing", 
        "yards_pass_att", "yards_pass_att_avg", "yards_pass_comp", "yards_pass_game", "pass_rate", "sacks", "sacks_pass", "yards_net_pass_att", "yards_net_pass_att_avg", "sacks_pct", "comebacks", "game_win_drives", "season") 

passing <- passing[which(passing$rank_pfr!='Rk'), ] 

passing[, 4:28] <- apply(passing[,4:28], 2, as.numeric) 

passing[is.na(passing)] <- 0 

# Note that season is the last column (both colname and viewing the data) 
# colnames(passing) 
# View(passing) 

passing[, 4:28] <- plyr::ddply(passing[, 4:28], .(season), colwise(normalize)) 

# Note that season still *appears* to be the last column 
# colnames(passing) 

# But when you view the data the season values have been 
# inserted under age, and everything else seems to be shifted to the right 
# View(passing) 

감사합니다!

+0

최소한의 작업 예제를 예기치 않은 재정렬이 발생하는 코드 행으로 제한하고 입력 데이터를'dput '으로 제공하는 것이 더 쉬울 것입니다. –

+0

@beginneR 여러 사이트에서 데이터를 스크랩하고 있기 때문에 실제로이를 최소화하는 방법을 알지 못합니다. 게다가 충분한 코드가 없다는 이유로 과거에 비판을 받았습니다. –

+0

오케이, 알겠습니다. 아마 당신이 아마 더 빠른 반응을 얻을 것이라고 생각했습니다. 마지막'ddply' 호출에서 당신이 설명하는 재정렬이 일어나는 것이 맞습니까? –

답변

3

"정상적인"plyr은 그룹화로 인한 동작이라고 생각합니다. .(season). 예를 들어, mtcars 데이터 세트를 사용하여 동일하게 수행하고 결과를 비교할 수 있습니다.

head(mtcars) 
        mpg cyl disp hp drat wt qsec vs am gear carb 
Mazda RX4   21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 
Mazda RX4 Wag  21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 
Datsun 710  22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 
Valiant   18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 

위치는 carb입니다. 당신의 normalize 기능을 사용

: 기본 기능 두 경우에 따라서

ddply(mtcars, .(carb), colwise(max)) 
    carb mpg cyl disp hp drat wt qsec vs am gear 
1 1 33.9 6 258.0 110 4.22 3.460 20.22 1 1 4 
2 2 30.4 8 400.0 175 4.93 3.845 22.90 1 1 5 
3 3 17.3 8 275.8 180 3.07 4.070 18.00 0 0 3 
4 4 21.0 8 472.0 264 4.22 5.424 18.90 1 1 5 
5 6 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 

ddply(mtcars, .(carb), colwise(normalize)) 
# carb  mpg cyl  disp   hp  drat   wt  qsec vs am gear 
#1  1 0.29746835 0 0.19743178 0.62222222 0.74657534 0.29846154 0.00000000 NaN 1 1.0 
#2  1 0.20886076 1 1.00000000 1.00000000 0.21917808 0.84923077 0.51552795 NaN 0 0.0 
#3  1 0.00000000 1 0.82343499 0.88888889 0.00000000 1.00000000 1.00000000 NaN 0 0.0 
#4  1 0.90506329 0 0.04066346 0.02222222 0.90410959 0.22461538 0.53416149 NaN 1 1.0 
#5  1 1.00000000 0 0.00000000 0.00000000 1.00000000 0.00000000 0.80124224 NaN 1 1.0 

더블 체크를하는 방식으로 ddply 주문 결과 data.frame는 그룹화 변수는 것을 첫 번째 열과 다른 모든 열은 오른쪽으로 이동합니다. 그룹을 .(carb, cyl)으로 지정할 때 어떤 일이 발생하는지 확인할 수도 있습니다.

내가 추천하는 한 가지는 data.frames에서 작동하는 최신 패키지 인 dplyr을 사용하는 것입니다. 코드에 dplyr 동등한은 다음과 같습니다

열 1
library(dplyr) 
passing <- passing %>% 
      group_by(season) %>% 
      mutate_each(funs(normalize), -c(1:4)) 

: 4 당신이 정상화하지 않으려는 열입니다. 당신이 dplyr이 열 순서를 변경하지 않는 것을 볼 수 있습니다

mtcars %>% group_by(carb) %>% mutate_each(funs(normalize)) 

을 실행하여

.

보조 노트에

: 나는 당신의 코드를 실행할 때

season 변수를 만들려면, 당신은 단지

season <- 2004:2013 

또는

season <- first_season:last_season 

그리고를 사용할 수 있습니다, 대부분의 열이의 있었다 클래스 factor s. 당신은 숫자로 변환하는
passing[, 4:28] <- apply(passing[,4:28], 2, as.numeric) 

를 사용하지만, 내가 본 것을, 올바르게 변환 as.numeric(as.character(...))을 사용해야 같은 경우에 해당 전환하기 전에 가지고있는 데이터는 요소로 구성되어 있습니다.

희망이 있습니다.

관련 문제