对R来说,我不知道如何解决这个问题。希望你能帮忙。
我有一个批量树,如下面的小版本。
ID Batch Input_Bx Input_Wt Imp_In Imp_Out
4 B123/1 A123/1 75.1 0.08 0.06
12 B123/2 A123/1 25.2 0.08 0.04
3 B123/2 A123/2 50.1 0.02 0.04
9 B123/3 A123/2 50.0 0.02 0.05
我想要做的是,对于每个有多个输入批次(Input_Bx)的情况(例如B123 / 2),我想通过Imp_In多次输入Input_Wt,对所有输入批次求和这些产品并除以输入批次的权重总和。因此,对于数据表的这个片段,我会得到:
Batch B123/1: (75.1 * 0.08) / (75.1) = 0.08
Batch B123/2: (25.5 * 0.08 + 50.1 * 0.02) / (25.2 + 50.1) = 0.04039841
Batch B123/3: (50.0 * 0.02) / (50.0) = 0.02
并制作一个新的df,如:
Batch Eff_Imp Imp_Out
B123/1 0.08 0.06
B123/2 0.04039841 0.04
B123/3 0.02 0.05
一个例子真的很有帮助。
TIA。
答案 0 :(得分:1)
方法如下:
#your data
DF <- read.table(text = 'ID Batch Input_Bx Input_Wt Imp_In Imp_Out
4 B123/1 A123/1 75.1 0.08 0.06
12 B123/2 A123/1 25.2 0.08 0.04
3 B123/2 A123/2 50.1 0.02 0.04
9 B123/3 A123/2 50.0 0.02 0.05', header = T, stringsAsFactors = F)
#`split` your data based on `Batch` and calculate the `weighted.mean` in each
w.m <- lapply(split(DF, DF$Batch), function(x) weighted.mean(x$Imp_In, x$Input_Wt))
#w.m
#$`B123/1`
#[1] 0.08
#$`B123/2`
#[1] 0.04007968
#$`B123/3`
#[1] 0.02
#combine, in a `data.frame`, the `Batch` / its weighted mean / its `Imp_Out`
#I suppose same `Batch`es have same `Imp_Out`s
newDF <- data.frame(cbind(names(w.m), unlist(w.m),
aggregate(DF$Imp_Out, list(DF$Batch), unique)$x), row.names = NULL)
names(newDF) <- c("Batch", "Eff_Imp", "Imp_Out")
#newDF
# Batch Eff_Imp Imp_Out
#1 B123/1 0.08 0.06
#2 B123/2 0.0400796812749004 0.04
#3 B123/3 0.02 0.05
答案 1 :(得分:0)
您可以使用data.table
库 -
dt <- data.table(df)
dt[,
list(
Eff_Imp = weighted.mean(x = Imp_in, w = Input_Wt )
),
by = "Batch"
]
答案 2 :(得分:0)
ddply
替代方案:
library(plyr)
ddply(.data = df, .variables = .(Batch), summarize,
Eff_imp = weighted.mean(Imp_In, Input_Wt),
Imp_out = Imp_out[1]) # assuming one value of Imp_out within Batch
# Batch Eff_imp Imp_out
# 1 B123/1 0.08000000 0.06
# 2 B123/2 0.04007968 0.04
# 3 B123/3 0.02000000 0.05