2010-09-18 3 views
0

Я немного новичок в R, и я столкнулся с точкой, в которой мне нужна помощь. Я полагаю, что пакет reshape может выполнить то, что мне нужно сделать.Ошибка изменения - неверный коэффициент

Вот структура исходного кадра данных:

> 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 

Вот первые несколько строк:

> 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 

Я ищу, чтобы создать новый фрейм данных, поворачивающийся на GameID и период , а остальные столбцы суммируют данные для каждой строки home_ind (всего 10 столбцов).

Когда я запускаю следующий код:

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

Я получаю следующее сообщение об ошибке:

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 

Любая помощь будет очень признателен!

Edit: Это то, что я надеюсь получить реструктурированных данные выглядеть

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 

ответ

2

Теперь я вижу, что вы пытаетесь сделать, вот подход с использованием summarise из 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) 

Есть также целый ряд способов сделать это, используя только базовые функции (например, подмножество, а затем изменение имен)

3

поскольку после плавления, все переменные мера будет в том же столбце, что они должны быть одного типа. В вашем случае «команда» - это символ, «цели» - числовые, поэтому вы получили эту ошибку.

2

Я думаю, вам будет полезно использовать ddply из пакета plyr для этой проблемы. Вы не сказали, как хотите обобщить данные, но проверьте функции summarise, если вы хотите использовать другую сводную функцию для каждой переменной или функцию colwise, если хотите суммировать все переменные одинаково.

+0

Как всегда, спасибо за совет hadley. Я не могу понять, что я бы обобщил. Я отредактировал сообщение выше, чтобы подчеркнуть, что я надеюсь, что новый кадр данных будет выглядеть. Раньше я пытался использовать sqldf и почти получил его, но цифра должна быть проще с некоторыми из ваших пакетов. – Btibert3

0

Спасибо за помощь. Я закончил тем, что пошел другим путем и разбил проблему на маленькие кусочки. Я уверен, что это быстрее, более элегантно, но я добрался туда, где должен был быть, и хотел бы поделиться кодом, если это поможет кому-то другому.

## 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) 
Смежные вопросы