2

計算のために乗算する必要がある 2 つのデータ セットを持つデータフレームがあります。シンプルなバージョンは

sample = data.frame(apples=c(10,20,25,30,40,NA,NA,15))
sample$oranges = c(25,60,90,86,10,67,45,10)
sample$oats = c(65,75,85,95,105,115,125,135)
sample$eggs = c(23,22,21,20,19,18,17,16)
sample$consumer =c('john','mark','luke','paul','peter','thomas','matthew','brian')
sample$mealtime = c('breakfast','lunch','lunch','snack','lunch','breakfast','snack','dinner')

s1 = melt(sample,id.vars=c(5,6),measure.vars=c(1:4))

私がやろうとしているのは、

s2 = dcast(s1, mealtime ~ ., function(x) (x[variable == 'oranges'] * x[variable =='apples'])/sum(x[variable == 'apples'])

実際には、はるかに長いdata.frameとより複雑な計算ですが、原則は同じでなければなりません。ありがとう -- SO への最初の投稿なので、エラーについてはお詫びします。

出力は、Id var として食事時間を持ち、各食事時間の値としてオレンジ色のデータのリンゴ加重平均を持つデータ フレームになります。

の線に沿った何か

    Group.1         x
1 breakfast  1.785714
2    dinner  1.071429
3     lunch 27.500000
4     snack 18.428571

これは、

sample$wa = sample$oranges*sample$apples/sum(sample$apples)
aggregate(sample$wa,by=list(sample$mealtime),sum,na.rm=T)

これは数学的には間違っているように感じますが、素早い不器用な概算であることを意図していました。

4

1 に答える 1

1

これは、形状変更よりもplyrの方がはるかに優れたタスクです。

library(plyr)
s1<-ddply(sample,.(mealtime), function(x) {return(sum(x$apples,x$oranges))})

そして今、あなたは出力を明確にしました:

ddply(sample,.(mealtime), summarize,
      wavg.oranges = sum(apples * oranges, na.rm=TRUE) / sum(apples, na.rm=TRUE))
#    mealtime wavg.oranges
# 1 breakfast     25.00000
# 2    dinner     10.00000
# 3     lunch     45.29412
# 4     snack     86.00000
于 2012-09-16T05:37:38.680 に答える