[英]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.