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

ddplyこの問題については、plyrパッケージから使用する方がよいと思います。データをどのように要約したいかは述べていませんが、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 に答える