2012-05-13 6 views
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での経験はほとんどないので、些細な質問であれば謝罪しますが、解決策を見つけることができませんでした。

+0

おそらく、 'subset()'関数を見れば分かります。また、Rは2つの "等号"記号、すなわち等号を示すために '=='を使用することに注意してください。 –

+0

元のスクリプトでは、それが 'function()'であることを確認することもできます( "funtion()"ではなく)。そして、あなたは "actaul"の代わりに "actual"とタイプします... – vaettchen

答えて

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 
+0

すべてのスペルミスをお詫び申し上げます。これは私が記事のために作った簡単な例です。実際のコードは私の仕事用コンピュータにあります。このコードは、入力にどのような組み合わせを追加しても、古いデータセットの列手段を返すように見えます。関数は、入力した入力によって作成されたサブセットの平均値のみを返すようにします。コードに何かがないのですか?また、どのように使用するのですか?私は機能が新しく、同じことをしているようだ。お手伝いありがとう! – user11281

0

Andrieのソリューションはすでに完全です。 (ddplyはすごい!その機能については知らなかった...)

ただ1つの追加:可能なすべての組み合わせでサマリー値を計算したい場合は、Rを使用して1つのライナーとして実行できますオンボード機能by:あなたが尋ねたが、それでも有益であるかもしれないもの、厳密ではありません

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

関連する問題