Domanda

Sono un po 'nuovo a R e ho incontrato un punto in cui ho bisogno di aiuto. Immagino che il pacchetto di rimodellare può compiere ciò che devo fare.

Ecco la struttura del frame di dati originale:

> str(bruins)
'data.frame':   10 obs. of  6 variables:
 $ gameid  : Factor w/ 1 level "20090049": 1 1 1 1 1 1 1 1 1 1
 $ team    : chr  "NYI" "BOS" "NYI" "BOS" ...
 $ home_ind: chr  "V" "H" "V" "H" ...
 $ period  : Factor w/ 5 levels "1","2","3","4",..: 1 1 2 2 3 3 4 4 5 5
 $ goals   : int  0 0 3 0 0 3 0 0 3 3
 $ shots   : int  16 7 9 7 8 12 5 4 38 30

Ecco le prime righe:

> head(bruins)
      gameid team home_ind period goals shots
409 20090049  NYI        V      1     0    16
410 20090049  BOS        H      1     0     7
411 20090049  NYI        V      2     3     9
412 20090049  BOS        H      2     0     7
413 20090049  NYI        V      3     0     8
414 20090049  BOS        H      3     3    12

Cerco di creare un nuovo frame di dati infulcrata sulla GameID e periodo, con il resto delle colonne di sintesi dei dati per ogni riga home_ind (10 colonne in tutto).

Quando eseguo il seguente codice:

b.melt <- melt(bruins, id=c("gameid", "period"), na.rm=TRUE)

ottengo il seguente errore:

Warning messages:
1: In `[<-.factor`(`*tmp*`, ri, value = c(0L, 0L, 3L, 0L, 0L, 3L, 0L,  :
  invalid factor level, NAs generated
2: In `[<-.factor`(`*tmp*`, ri, value = c(16L, 7L, 9L, 7L, 8L, 12L,  :
  invalid factor level, NAs generated

Ogni aiuto sarà molto apprezzato!

Edit: Questo è quello che sto sperando di ottenere i dati ristrutturati per assomigliare

    gameid period vis_team vis_goals vis_shots home_team home_goals home_shots
1 20090049      1     NYI      0      16       BOS          0          7
2 20090049      2     NYI      3      9        BOS          0          7
3 20090049      3     NYI      0      8        BOS          3         12
È stato utile?

Soluzione

Ora vedo quello che stai cercando di fare, ecco un approccio usando summarise da plyr:

home <- summarise(subset(per, home_ind == "V"), 
  gameid = gameid, period = period, 
  vis_team = team, vis_goals = goals, vis_shots = shots)

away <- summarise(subset(per, home_ind == "H"), 
  gameid = gameid, period = period, 
  home_team = team, home_goals = goals, home_shots = shots)

join(home, away)

Ci sono anche una serie di modi per farlo utilizzando funzioni solo di base (per esempio mediante sottoinsiemi e quindi modificando nomi)

Altri suggerimenti

poiché dopo la fusione, tutte le variabili di misura saranno nella stessa colonna, dovrebbero essere dello stesso tipo. Nel tuo caso, "squadra" sono di carattere, "obiettivi" sono numerici, così hai quell'errore.

penso che sarebbe meglio utilizzare ddply dal pacchetto plyr per questo problema. Lei non ha detto come si voleva per riassumere i dati, ma controllare le funzioni summarise se si desidera utilizzare una funzione di riepilogo diverso per ogni variabile, o la funzione colwise se si desidera riepilogare tutte le variabili allo stesso modo.

Grazie per l'aiuto. Ho finito per andare un percorso diverso e rotto il problema in piccoli pezzi. Sono sicuro che questo è più veloce, modo più elegante, ma ho avuto modo in cui avevo bisogno di essere e ha voluto condividere il codice nel caso in cui questo aiuta a qualcun altro.

## load libraries 
library(sqldf)

## assume that the dataset is loaded
## restructure the data and merge together
sql.1 <- "SELECT gameid, period, team `vis_team`, goals `vis_goals`, shots `vis_shots`"
sql.2 <- "FROM per WHERE home_ind='V' GROUP BY gameid, period "
sql.cmd <- paste(sql.1, sql.2, sep="")
vis <- sqldf(sql.cmd)

sql.1 <- "SELECT gameid, period, team `home_team`, goals `home_goals`, shots `home_shots`"
sql.2 <- "FROM per WHERE home_ind='H' GROUP BY gameid, period "
sql.cmd <- paste(sql.1, sql.2, sep="")
home <- sqldf(sql.cmd)

my.dataset <- merge(vis, home)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top