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 和 period 为中心的新数据框,其余列汇总每个 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

任何帮助将不胜感激!

编辑:这就是我希望得到重组数据的样子

    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
4

4 回答 4

3

因为熔化后,所有测量变量都将在同一列中,它们应该是相同的类型。在您的情况下,“团队”是角色,“目标”是数字,因此您遇到了该错误。

于 2010-09-18T04:01:22.647 回答
2

我认为你最好ddplyplyr包中使用这个问题。你没有说你想如何总结数据,但是summarise如果你想为每个变量使用不同的总结函数,或者colwise如果你想以相同的方式总结所有变量,请查看函数。

于 2010-09-18T12:15:26.440 回答
2

现在我明白了您要做什么,这是使用summarisefrom 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)

还有很多方法可以只使用基本函数(例如,通过子集然后修改名称)

于 2010-09-19T14:20:32.380 回答
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)
于 2010-09-18T23:33:35.207 回答