3

次のような「きちんとした」形式のデータセットがあります。

  group         type score price
1     A Fish + Chips     9     8
2     B Fish + Chips     7    20
3     C Fish + Chips     8    22
4     A        Chips     9     0
5     B        Chips     0     7
6     C        Chips     8    16
7     A        Snags     5    19
8     B        Snags     9     8
9     C        Snags    10     6

データがワイドフォーマットにキャストされた場合、列演算(加算、減算など)を使用して決定される派生データを追加したいと思います。私は、キャストして再び溶かさずにこれを行う方法を考え出そうとしています. ここの簡単な例では、対応するデータからデータをFish差し引くことによって、タイプのデータを計算したいと思います。これまでのところ、次のことを思いつきました。ChipsFish + Chips

ddply(subset(mydata, type %in% c("Chips", "Fish + Chips")),
      .(group), summarise, type="Fish",
      score=score[type=="Fish + Chips"] - score[type=="Chips"],
      price=price[type=="Fish + Chips"] - price[type=="Chips"])

を与える

  group type score price
1     A Fish     0     8
2     B Fish     7    13
3     C Fish     0     6

その後rbind、元のデータに戻すことができます。より良いアプローチの提案をいただければ幸いです (たとえそれがキャスト アンド メルトであっても)。

サンプルデータは次のとおりです。

structure(list(group = structure(c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 
 2L, 3L), .Label = c("A", "B", "C"), class = "factor"), type = structure(c(2L, 
 2L, 2L, 1L, 1L, 1L, 3L, 3L, 3L), .Label = c("Chips", "Fish + Chips", 
 "Snags"), class = "factor"), score = c(9, 7, 8, 9, 0, 8, 5, 9, 
 10), price = c(8, 20, 22, 0, 7, 16, 19, 8, 6)), .Names = c("group", 
 "type", "score", "price"), row.names = c(NA, -9L), class = "data.frame")
4

1 に答える 1

2

私はあなたの方が優れていると思いますが、ここに非プライア/リシェイプソリューションがあります:

mydataspl <- split(mydata, mydata$type)
subs <- merge(mydataspl$"Fish + Chips", mydataspl$Chips, by= 1)
data.frame(subs[,"group", drop=FALSE], type="Fish", 
   score=with(subs, score.x-score.y), 
   price=with(subs, price.x-price.y)
           )
  group type score price
1     A Fish     0     8
2     B Fish     7    13
3     C Fish     0     6
于 2012-08-23T22:54:52.380 に答える