【问题标题】:R get value at minimum and maximum time of dayR在一天中的最小和最大时间获取值
【发布时间】:2018-02-28 11:28:44
【问题描述】:

我有一些数据需要轻松分析。我想创建一周中每天平均使用量的图表。数据位于data.table 中,结构如下:

               time       value
2014-10-22 23:59:54   7433033.0
2014-10-23 00:00:12   7433034.0
2014-10-23 00:00:31   7433035.0
2014-10-23 00:00:49   7433036.0
...
2014-10-23 23:59:21   7443032.0
2014-10-23 23:59:40   7443033.0
2014-10-23 23:59:59   7443034.0
2014-10-24 00:00:19   7443035.0

由于该值是累积的,我需要一天的最大值,减去当天的最小值,然后对同一天的所有值取平均值。

我已经知道如何获取星期几(使用as.POSIXlt$wday)。那么我怎样才能得到每日的差异呢?一旦我将数据保存在如下结构中:

dayOfWeek  value
        0     10
        1     20
        2     50

我应该能够使用某些功能自己找到mean

这是一个示例:

library(data.table)
data <- fread("http://pastebin.com/raw.php?i=GXGiCAiu", header=T)
#get the difference per day

#create average per day of week

【问题讨论】:

  • 你能提供一个小的可重现的示例数据集吗?另外,也许你想用data.table 标记它,以防有更快的方法来利用这个包。
  • 如果您已经有了星期几。尝试data[, .(value2=diff(value))] 获取每日差异。
  • @plafort 如果您查看数据摘录的时间列,您会发现每天有多个度量值。
  • @Frank OP 表示他们已经能够汇总数据。他们的摘要示例显示了分成不同日期的数据。他们要求列出价值列中的差异。

标签: r data.table


【解决方案1】:

使用 R 有很多方法可以做到这一点。您可以使用基础 R 或 data.tabledplyr 包中的 ave。这些解决方案都将摘要添加为数据列。

数据

df <- data.frame(dayOfWeek = c(0L, 0L, 1L, 1L, 2L), 
                 value = c(10L, 5L, 20L, 60L, 50L))

基数 r

df$min <- ave(df$value, df$dayOfWeek, FUN = min)
df$max <- ave(df$value, df$dayOfWeek, FUN = max)

数据表

require(data.table)
setDT(df)[, ":="(min = min(value), max = max(value)), by = dayOfWeek][]

dplyr

require(dplyr)
df %>% group_by(dayOfWeek) %>% mutate(min = min(value), max = max(value))

如果你只想要摘要,你还可以使用以下内容:

# base
aggregate(value~dayOfWeek, df, FUN = min)
aggregate(value~dayOfWeek, df, FUN = max)
# data.table
setDT(df)[, list(min = min(value), max = max(value)), by = dayOfWeek]
# dplyr
df %>% group_by(dayOfWeek) %>% summarise(min(value), max(value))

【讨论】:

  • OP 中唯一的问号是“那么我怎样才能获得每日差额?”答案似乎是diff(range(x)),对吧?无论如何,很好的答案教我ave 的用途:) 另外,OP 以data.table 开头,而不是data.frame
【解决方案2】:

这实际上是一个比乍看起来更棘手的问题。我认为您需要 两个 单独的聚合,一个通过取范围的差异来聚合每个日历日内的累积使用值,然后另一个按工作日聚合每个日历日的使用值.你可以用weekdays()提取工作日,用range()上的diff()计算日差,用mean()计算平均值,用aggregate()聚合:

set.seed(1);
N <- as.integer(60*60*24/19*14);
df <- data.frame(time=seq(as.POSIXct('2014-10-23 00:00:12',tz='UTC'),by=19,length.out=N)+rnorm(N,0,0.5), value=seq(7433034,by=1,length.out=N)+rnorm(N,0,0.5) );
head(df);
##                  time   value
## 1 2014-10-23 00:00:11 7433034
## 2 2014-10-23 00:00:31 7433035
## 3 2014-10-23 00:00:49 7433036
## 4 2014-10-23 00:01:09 7433037
## 5 2014-10-23 00:01:28 7433039
## 6 2014-10-23 00:01:46 7433039
tail(df);
##                      time   value
## 63658 2014-11-05 23:58:14 7496691
## 63659 2014-11-05 23:58:33 7496692
## 63660 2014-11-05 23:58:51 7496693
## 63661 2014-11-05 23:59:11 7496694
## 63662 2014-11-05 23:59:31 7496695
## 63663 2014-11-05 23:59:49 7496697
df2 <- aggregate(value~date,cbind(df,date=as.Date(df$time)),function(x) diff(range(x)));
df2;
##          date    value
## 1  2014-10-23 4547.581
## 2  2014-10-24 4546.679
## 3  2014-10-25 4546.410
## 4  2014-10-26 4545.726
## 5  2014-10-27 4546.602
## 6  2014-10-28 4545.194
## 7  2014-10-29 4546.136
## 8  2014-10-30 4546.454
## 9  2014-10-31 4545.712
## 10 2014-11-01 4546.901
## 11 2014-11-02 4544.684
## 12 2014-11-03 4546.378
## 13 2014-11-04 4547.061
## 14 2014-11-05 4547.082
df3 <- aggregate(value~dayOfWeek,cbind(df2,dayOfWeek=weekdays(df2$date)),mean);
df3;
##   dayOfWeek    value
## 1    Friday 4546.196
## 2    Monday 4546.490
## 3  Saturday 4546.656
## 4    Sunday 4545.205
## 5  Thursday 4547.018
## 6   Tuesday 4546.128
## 7 Wednesday 4546.609

【讨论】:

    【解决方案3】:

    在寻找其他东西时遇到了这个。我认为您正在寻找每周一、周二等的差异和平均值。坚持使用 data.table 可以快速进行一次通话,以获得一周中每一天的平均值和一周中每一天的差异。这给出了 7 行和 3 列的输出。

    library(data.table)
    data <- fread("http://pastebin.com/raw.php?i=GXGiCAiu", header=T)
    
    data_summary <- data[,list(mean = mean(value),
                               diff = max(value)-min(value)),
                         by = list(date = format(as.POSIXct(time), format = "%A"))]
    

    这给出了 7 行和 3 列的输出。

            date    mean   diff
    1:  Thursday 7470107 166966
    2:    Friday 7445945   6119
    3:  Saturday 7550000 100000
    4:    Sunday 7550000 100000
    5:    Monday 7550000 100000
    6:   Tuesday 7550000 100000
    7: Wednesday 7550000 100000
    

    【讨论】:

      猜你喜欢
      • 2010-11-06
      • 2019-05-18
      • 2020-04-30
      • 1970-01-01
      • 2013-07-12
      • 2019-07-13
      • 1970-01-01
      • 2018-09-17
      • 1970-01-01
      相关资源
      最近更新 更多