2

3 つのカテゴリ入力を取り、これらの入力に基づいて要約統計量のベクトルを返す関数を作成するのに助けが必要です。

このデータ セットには、小売セグメント、ブランド名、商品の種類、小売価格、および実際に販売された商品によって特定できる小売商品に関する情報が含まれています。

ここで、これらの入力を取り、平均化、カウント、その他必要なものを計算する関数を作成する必要があります。

次のように機能を設定しました(作成されたデータを使用):

dataold = data.frame(segment=c("golf","tenis","football","tenis","golf","golf"),
                   brand=c("x","y","z","y","x","a"),
                   type=c("iron","ball","helmet","shoe","driver","iron"),
                   retail=c(124,.60,80,75,150,108),
                   actual=c(112,.60,72,75,135,100))

retailsum = funtion(segment,brand,type){    
     datanew = dataold[which(dataold$segment='segment' & 
                             dataold$brand='brand' & 
                             dataold$type='type'),c("retail","actaul")]

     summary = c(dim(datanew)[1],colMeans(datanew))
     return(summary)
}

関数ブレース内のコードは単独で機能しますが、関数をラップすると、エラーが発生するか、0カウントとNaN手段を返すだけになります。

どんな助けでも大歓迎です。私は R の経験がほとんどないため、これが些細な質問である場合は申し訳ありませんが、解決策を見つけることができませんでした。

4

2 に答える 2

7

コードには、次のような多くのエラーがあります。

  • のスペルミスfunction
  • (等価テスト)=ではなく単一の (代入) を使用する==
  • のタイプミスactual
  • をハードコーディングしsegment、引数を参照するのではなく、関数内で使用しますbrandtype

関数は次のようになりますつまり、有効な結果が生成されます。

retailsum <- function(data, segment,brand,type, FUN=colMeans){    
  x = with(data, data[segment==segment && brand==brand && type==type,
                      c("retail","actual")])
  match.fun(FUN)(x)
}

retailsum(dataold, "golf", "x", "iron", colMeans)
  retail   actual 
89.60000 82.43333 

plyrそして、これはパッケージを使用した(おそらくはるかに柔軟な)ソリューションです。これは、セグメント、ブランド、およびタイプのすべての組み合わせに対して関数を計算します。

library(plyr)
ddply(dataold, .(segment, brand, type), colwise(mean))
   segment brand   type retail actual
1 football     z helmet   80.0   72.0
2     golf     a   iron  108.0  100.0
3     golf     x driver  150.0  135.0
4     golf     x   iron  124.0  112.0
5    tenis     y   ball    0.6    0.6
6    tenis     y   shoe   75.0   75.0
于 2012-05-13T08:01:28.993 に答える
0

Andrie のソリューションは、すでにかなり完成しています。(ddplyかっこいい!その機能知らなかった…)

ただし、1 つだけ追加します。考えられるすべての組み合わせで集計値を計算する場合は、R のオンボード関数を使用してワンライナーとしてこれを行うことができますby

by(dataold, list(dataold$segment, dataold$brand, dataold$type), 
       function(x) summary(x[,c('retail', 'actual')])
)

それは厳密にはあなたが求めたものではありませんが、それでも有益かもしれません。

于 2012-05-13T08:12:11.490 に答える