计算多列的加权平均值

时间:2018-05-17 22:09:08

标签: mysql r

我有一个表table1,在ID列的每个值中包含多行。对于大量列,我想使用相同的持续时间列time来计算相同类型的加权平均值。

我可以手动定义每一列:

drop table if exists table2;
create table table2 as 
select ID, 
 sum(var1*time)/sum(time) as var1,
 sum(var2*time)/sum(time) as var2,
 sum(var3*time)/sum(time) as var3,
 sum(var4*time)/sum(time) as var4
 from table1 group by ID;

有没有办法以编程方式为大量列执行此操作?

我们可以说我可以使用正则表达式来识别感兴趣的列。我们可以在这个例子中使用语法var1,var2,var3等。

2 个答案:

答案 0 :(得分:1)

考虑构建sum表达式的向量,然后在较大的SQL语句中构建paste(..., collapse)。将1:4调整为实际变量范围。换行符不会在传递的查询中呈现。

sums <- paste0("  sum(var", 1:4, "*time)/sum(time) as var", 1:4)

sql <- paste0('select ID,\n',
              paste(sums, collapse = ', \n'), '\n',
              'from table1 \n', 
              'group by ID;')

cat(sql)
# select ID,
#   sum(var1*time)/sum(time) as var1, 
#   sum(var2*time)/sum(time) as var2, 
#   sum(var3*time)/sum(time) as var3, 
#   sum(var4*time)/sum(time) as var4
# from table1 
# group by ID;

channel <- odbcConnect("redacted",uid="redacted",case="nochange")
x <- sqlQuery(channel, sql)

答案 1 :(得分:0)

有点诙谐,但这也是我真正必须做的事情(在R中):

library(RODBC)
library(data.table)
channel <- odbcConnect("redacted",uid="redacted",case="nochange")
x <- as.data.table(sqlQuery(channel, "select * from schema1.table1"))
vars <- grep("var", names(x), v=TRUE)
out <- x[,lapply(.SD, function(v){
  sum(v*time)/sum(time)
}),by=ppt_id, .SDcols=vars]
sqlSave(channel, as.data.frame(out), tablename="schema1.table2")

我仍然想知道如何在mysql中执行此操作。