2012-09-16 35 views
2

我有一个数据帧,其中有两组数据需要乘以计算。一个简单的版本将是使用长整型数据框中的两个子集对R进行重构

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变量和橙色数据的苹果加权平均值作为每餐时间的值。

沿

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) 

其中数学感觉关闭,但本来是一个快速的缺憾近似计算。

+0

由于你的代码失败,你可以描述预期的输出? – flodel

+0

你可以在你的问题中添加*你在提供的输出中如何计算“x”。 – A5C1D2H2I1M1N2O1R2T1

+0

感谢大家耐心提问这个问题的迭代过程。 –

回答

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

@ flodel,我想我将不得不追查一些其他答案,以得到赞扬,在这里给你一些信用。 – A5C1D2H2I1M1N2O1R2T1

+0

谢谢@ flodel。我在附加一个推论链接到我在研究这个时发现的另一个问题,并在看到你的回应之前。它遵循相同的方法,并巧妙地使用数据框来添加额外的列。主要是为了完整性,以防其他人遇到这种情况,寻找相同的东西。 [链接](http://stackoverflow.com/questions/3277326/group-by-in-r-ddply-with-weighted-mean) –

相关问题