1

Rで関数を構築する(またはいくつかの適用を賢く使用する)のに問題があります。次のようなデータセットがあります。

df<- data.frame( id <-sample(1:10,100, replace = T),
price <-runif(20)*100,
q = sample(1:100,100, replace = T))
colnames(df)<-c("id","price","quantity")

ここで、個々の ID ごとに平均価格を計算する必要があります。だから私はこのようにそれぞれ異なるIDでそれを行うことができます:

sum(((df$p[df$id == "1" ])*(df$q[df$id == "1" ])/(sum(df$q[df$id == "1" ]))))  

しかし、どうすれば df$id のすべての可能な値を通過させ、合計と一緒に ID も含むマトリックス/df として出力することができますか? 約 6000 の異なる ID と約 180000 の obs があります。それも速くできるといいのですが?

別の方法で分解すると、これが私のデータであると仮定します。

id price quantity
1   10    2
1   20    1
1   50    5
2   5     5
2   3     6 
2   10    4

したがって、ID = 1 の場合の解は次のようになります。( 10 * 2 + 20*1 +50 * 5 ) / (2+1+5) = 36.25これにより、価格 pr が得られます。ID = 1 のすべてのユニットの unit。

およびこのデータ生成を使用して更新set.seed(1234):

set.seed(1234)
df<- data.frame( id <-sample(1:10,100, replace = T),
price <-runif(20)*100,
q = sample(1:100,100, replace = T))
colnames(df)<-c("id","price","quantity")

結果は次のようになります。

id avg.price.per.unit
1 33,71
2 29,84
3 44,53
4 36,27
5 69,63
6 35,99
7 45,26
8 58,32
9 33,36
10 9,67

丸みは少しずれているかもしれません。

4

2 に答える 2

2

ライブラリddplyから使ってみてください。plyr[編集] 投稿者が(最終的に)希望する正確な計算を定義したので、解決策は簡単です。

set.seed(1234)
df<- data.frame( id <-sample(1:10,100, replace = T),
price <-runif(20)*100,
q = sample(1:100,100, replace = T))
colnames(df)<-c("id","price","quantity")

library(plyr)

df2 <- ddply(df, .(id), summarise,
             price.x.quantity = sum(price*quantity),
             sum.q = sum(quantity))
df2$avg <- with(df2, price.x.quantity/sum.q)
df2

これにより、次のようになります。

> df2
   id price.x.quantity sum.q       avg
1   1        17668.111   524 33.717769
2   2        18559.773   622 29.838863
3   3        35222.731   791 44.529369
4   4        28433.181   784 36.266813
5   5        10304.568   148 69.625462
6   6        31534.830   876 35.998665
7   7        29513.494   652 45.266095
8   8        25542.908   438 58.317141
9   9        22216.174   666 33.357619
10 10         2263.581   234  9.673423
> 
于 2013-09-17T06:56:02.640 に答える