【问题标题】:comparing mean to specific data value in R将平均值与 R 中的特定数据值进行比较
【发布时间】:2012-10-26 18:38:39
【问题描述】:

我有一个这样的数据框:

Date     Process Duration
1/1/2012 xnit     10
1/1/2012 xnit     15
1/1/2012 xnit     20
1/2/2012 telnet   80
1/2/2012 telnet   50
1/2/2012 telnet   40
8/1/2012 ftp      3
8/1/2012 ftp      11
8/1/2012 ftp     12

转换成x后

我可以这样计算每个工作的平均值:

x<-x[, mean := mean(Duration), by = Process]

我喜欢将特定日期的持续时间与平均值进行比较。我试过这个:

x<-x[, Aug1 := subset(x, Date==as.Date(c("2012-08-01")))$Duration, by = Process]

一旦我得到这个值,我打算将 Aug1 列与每个进程的平均值进行比较,以查看异常值。但是,此命令需要很长时间才能完成。有没有更好的方法来做到这一点?

【问题讨论】:

  • 您能否编辑您的问题(和标签)以澄清这是否实际上是 data.table ?
  • 您打算如何比较?你期望最后一行代码返回什么?我想您可能想添加一个月列然后使用by=month,但我真的不明白您希望做什么。您能否包括您的最后一行代码的预期输出以及您最终想要的结果?
  • 使用:= 时无需重新分配给x,因为这是通过引用分配给x。我也不会将subset$ 与data.tables 一起使用,因为这会避免所有data.table 的效率。

标签: r dataframe data.table


【解决方案1】:

使用:= 时无需重新分配给 x,因为这是通过引用分配给 x 的(特别是从默认情况下不会打印的 1.8.3 版本)。我也不会使用子集或$with data.tables,因为这会避免所有 data.table 效率。 ——

试试这样的

 x <- data.table(x)
 # add a column that is the by-process mean
 x[, mean_duration := mean(Duration), by = Process]

 # calculate the difference
 x[, diff_duration := Duration - mean_duration]

 # subset just the 1st of august
 x[Date==as.Date("2012-08-01")]

如果data.tableDate 键入,则可以更有效地完成最后一个子集。在目前的形式中,最后一步是矢量扫描,但单次矢量扫描应该不会太低效。

我建议阅读介绍小插曲以更好地利用 data.table 语法和效率。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-01
    • 2015-03-12
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    相关资源
    最近更新 更多