2010-09-18 5 views
0

Je suis un peu nouveau à R et je suis tombé sur un point où j'ai besoin d'aide. Je pense que le paquet de remodelage peut accomplir ce que j'ai besoin de faire.Erreur de formatage - facteur non valide

Voici la structure du cadre de données d'origine:

> 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 

Voici les premières lignes:

> 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 

Je cherche à créer une nouvelle trame de données qui pivote sur gameid et période , avec le reste des colonnes résumant les données pour chaque ligne home_ind (10 colonnes au total).

Quand je lance le code suivant:

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

Je reçois l'erreur suivante:

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 

Toute aide sera très appréciée!

Edit: Voici ce que je suis l'espoir d'obtenir les données restructurées pour ressembler

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 

Répondre

2

Maintenant, je vois ce que vous essayez de faire, voici une approche utilisant summarise de 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) 

Il y a aussi un certain nombre de façons de le faire en utilisant les fonctions que base (par exemple sous-ensemble puis en modifiant les noms)

3

depuis après la fusion, toutes les variables de mesure seront dans la même colonne, ils doivent être de même type. Dans votre cas, "équipe" est un personnage, "objectifs" sont numériques, vous avez donc cette erreur.

2

Je pense que vous feriez mieux d'utiliser ddply du paquet plyr pour ce problème. Vous n'avez pas dit comment vous vouliez résumer les données, mais vérifiez les fonctions summarise si vous souhaitez utiliser une fonction de résumé différente pour chaque variable, ou la fonction colwise si vous souhaitez résumer toutes les variables de la même manière.

+0

Comme toujours, merci pour le conseil hadley. Je n'arrive pas à comprendre ce que je résumerais. J'ai édité le post ci-dessus pour mettre en évidence ce que j'espère que le nouveau cadre de données ressemblera. J'avais déjà essayé d'utiliser sqldf et je l'ai presque compris, mais je pense qu'il doit y avoir un moyen plus simple avec certains de vos paquets. – Btibert3

0

Merci pour l'aide. J'ai fini par emprunter un chemin différent et j'ai divisé le problème en petits morceaux. Je suis sûr que c'est plus rapide, plus élégant, mais je suis arrivé là où je devais être et je voulais partager le code au cas où cela aiderait quelqu'un d'autre.

## 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) 
Questions connexes