0

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) があるすべてのケースで、Input_Wt を Imp_In で乗算し、すべての入力バッチのこれらの積を合計し、の合計で割ることです。入力バッチの重み。したがって、データ テーブルのこのフラグメントについては、次のようになります。

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

例は本当に役に立ちます。

ティア。

4

3 に答える 3

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
于 2013-10-27T11:26:22.693 に答える
0

ライブラリを使用できますdata.table-

dt <- data.table(df)
dt[,
  list(
    Eff_Imp = weighted.mean(x = Imp_in, w = Input_Wt )
  ),
  by = "Batch"
]
于 2013-10-27T11:38:01.263 に答える
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
于 2013-10-27T11:43:23.063 に答える