2012-12-10 71 views
0

我想用R语言解决在postgresSQL中编写的窗口函数。R语言中的SQL窗口函数

据我所知,Raggregate()来计算分组数据。是否有任何库支持窗口功能?

+0

嗨。你需要一个例子来展示你用window postegre sql函数做了什么。 – agstudy

回答

0

如果您熟悉SQL语法,则可以使用aggregatemerge。 服用example from the PostgreSQL manual之一,我们将使用

empsalary <- data.frame(depname=rep(c("develop", "personnel", "sales"), c(5, 2, 3)), 
         empno=c(11, 7, 9, 8, 10, 5, 2, 3, 1, 4), 
         salary=c(5200, 4200, 4500, 6000, 5200, 3500, 3900, 4800, 5000, 4800)) 
merge(empsalary, aggregate(salary ~ depname, empsalary, mean), by="depname") 

再现第一实施例(通过depname计算平均工资)。

 depname empno salary.x salary.y 
1 develop 11  5200 5020.000 
2 develop  7  4200 5020.000 
3 develop  9  4500 5020.000 
4 develop  8  6000 5020.000 
5 develop 10  5200 5020.000 
6 personnel  5  3500 3700.000 
7 personnel  2  3900 3700.000 
8  sales  3  4800 4866.667 
9  sales  1  5000 4866.667 
10  sales  4  4800 4866.667 

您可能想要看看plyr必须提供更详细的结构。

+0

正确,上面的解决方案创建一个新的data.frame。你也可以模拟合并,如下所示:'m < - with(empsalary,rep(tapply(salary,depname,mean),table(depname)))'','cbind'在你的原始data.frame中生成的向量。例如,对于平均PERC。的工资,我们可以使用'empsalary $ avg.perc < - empsalary $ salary/m * 100'。 – chl

+0

谢谢你的回复。假设我想用R语言解决以下查询: SELECT depname,empno,(salary * avg(salary)OVER(PARTITION BY depname))* 100,(cost * avg(cost)OVER(PARTITION BY depname))* 100 FROM empsalary 然后,我是否需要编写一个单独的合并并为每个窗口函数创建一个临时数据框并合并所有最终结果..? –

+0

不是。您可以使用我提出的建议(按组计算均值并按行扩展,然后将其作为新列添加到您的data.frame中);您只需添加第二个聚合步骤,用'cost'替换'salary'。 (顺便说一句,*不要删除您的评论*,否则未来的读者将无法关注对话。) – chl