【问题标题】:Calculations on subsets of a data frame数据框子集的计算
【发布时间】:2013-10-27 10:30:28
【问题描述】:

作为 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

举个例子会很有帮助。

TIA。

【问题讨论】:

    标签: r


    【解决方案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
    

    【讨论】:

    • 你是明星!非常感激。谢谢。
    【解决方案2】:

    还有ddplyalternative:

    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
    

    【讨论】:

    • 谢谢。我还没有尝试过 plyr 包。看起来它可能真的很有用。
    • 您的解决方案最适合我。 (忙于阅读 plyr 教程!)
    • @Dave,很高兴为您提供帮助!祝你好运!
    【解决方案3】:

    您可以使用data.table 库-

    dt <- data.table(df)
    dt[,
      list(
        Eff_Imp = weighted.mean(x = Imp_in, w = Input_Wt )
      ),
      by = "Batch"
    ]
    

    【讨论】:

    • 谢谢。我会玩这个。
    猜你喜欢
    • 2013-09-27
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多