【问题标题】:How to perform conditional average in a data.frame如何在 data.frame 中执行条件平均
【发布时间】:2011-10-05 09:58:16
【问题描述】:

我有如下所示的 R 数据:

row, sessionId, scenarionName, stepName, duration
1, 1001, A, start, 0
2, 1001, A, step1, 2.2
3, 1001, A, step2, 3.0
4, 1001, A, end, 0
5, 1001, A, start, 0
6, 1002, B, start, 0
7, 1002, B, step1, 1.1
8, 1001, A, step1, 1.5
9, 1001, A, step2, 1.8
10, 1001, A, end, 0
11, 1002, B, step2, 2.1
12, 1002, B, end, 0

我想确定按场景分组的从开始到结束的平均持续时间总和。实现这一目标的最佳方法是什么?

例如,对于场景 A,这将是 ((0+2.2+3.0+0) + (0+1.5+1.8+0)) / 2 = 4.25

谢谢。

【问题讨论】:

  • 两个 cmets:1) 我不知道这个统计数据的实际含义是什么,但这肯定不是我计算平均值的方式。 2)你加错了。正确的值为 8.5/2=4.25
  • 关于 2),正确,我在电子表格中犯了一个错误。
  • 关于 1),你是什么意思?这些数据的真实世界意义是对 Web 应用程序的性能测试。每个会话由许多场景组成。每个场景都包含多个步骤。我想计算完整场景的平均持续时间。

标签: r aggregate average


【解决方案1】:

下面是使用data.table 的方法。请注意,此解决方案比您只有 2 次启动的情况更通用。

dt[,list(avg_dur = sum(duration)/sum(stepName == ' start')),'scenarionName']


       scenarionName avg_dur
[1,]             A    4.25
[2,]             B    3.20

【讨论】:

    【解决方案2】:

    查看reshape package 并重新整理您的数据:您拥有的格式称为“长”格式,因为每个 sessionID 有不止一行 - 您必须将其转换为宽格式,如下所示:

    sessionId, scenarioName, start, step1, step2, end
    1001,      A,            0,     2.2,   3.0,   0
    1001,      B , ...
    ...
    

    其他方法: 您可以使用 split()(可能两次)将数据拆分为您需要的子集,然后计算总和和平均值。

    【讨论】:

      【解决方案3】:

      如何使用plyr 按场景名称分组并计算请求的统计信息:

      library(plyr)
      ddply(dat, "scenarionName", summarize, newVal = sum(duration) / 2)
      
      > ddply(dat, "scenarionName", summarize, newVal = sum(duration) / 2)
        scenarionName newVal
      1             A   4.25
      2             B   1.60
      

      关键是 ddply 需要一个 data.frame 作为输入和一个分组变量。它将返回一个 data.frame 作为输出。 summarise 函数创建一个新的 data.frame 并且可以被认为是 transform 函数的并行。请参阅?summarize?transform 了解更多详情。

      【讨论】:

      • 不错的一个!您可能不想硬编码2,因为它会为每个场景计算starts 的数量。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-28
      • 2017-06-18
      • 2023-03-07
      • 2012-02-29
      • 2021-11-08
      相关资源
      最近更新 更多