簡體   English   中英

計算幾列的加權平均值

[英]Calculate a weighted average for several columns

我有一個表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等。

考慮構建一個求和表達式的向量,然后在較大的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)

有點嘲諷,但這也是我從字面上必須要做的(在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中做到這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM