【问题标题】:R group by date, and summarize the valuesR 按日期分组,并总结值
【发布时间】:2023-04-08 00:25:01
【问题描述】:

R 对我来说是新的,我正在使用(私有)数据集。

我有以下问题,我有很多时间序列:

2015-04-27  12:29:48
2015-04-27  12:31:48
2015-04-27  12:34:50
2015-04-27  12:50:43
2015-04-27  12:53:55
2015-04-28  00:00:00
2015-04-28  00:00:10

所有时间序列都有一个值:

Datetime                   value
2015-04-27  12:29:48       0.0 
2015-04-27  12:31:48       0.0
2015-04-27  12:34:50       1.1
2015-04-27  12:50:43      45.0 
2015-04-27  12:53:55       0.0
2015-04-28  00:00:00       1.0
2015-04-28  00:00:10       2.0

我想跳过所有的小时和分钟,像这样把它们加在一起:

Datetime      value
2015-04-27    46.1
2015-04-28     3.0

我做的第一件事是转换列日期时间:

energy$datetime <- as.POSIXlt(energy$datetime)  

我尝试了汇总功能:

df %>% group_by(energy$datetime) %>% summarize (energy$newname(energy$value))

但这不起作用。

我还阅读了互联网上的竞争性内容(例如:http://r.789695.n4.nabble.com/How-to-sum-and-group-data-by-DATE-in-data-frame-td903708.html),但对我来说没有意义。

我该如何解决这个问题?

【问题讨论】:

标签: r date time


【解决方案1】:

你在正确的道路上 - 尝试: summarise(newVal = sum(energy$value) ) 为您的总结电话。
df&lt;- energy %&gt;% group_by(datetime) %&gt;% summarise(sum =sum(value)) )

【讨论】:

  • 当我运行时:df %>% group_by(energy$datetime) %>% summarise(newval =sum(energy$value)) 我得到一个错误:UseMethod("group_by_") 中的错误:没有适用于“功能”类对象的“group_by_”方法
  • 您复制的代码不正确。请参阅我对您的问题的评论。 df 这里代表数据框。你的数据框叫df吗?也就是说,您的数据是否存储在名为df 的对象中?看起来您的数据存储在一个名为 energy 的对象中,因此请使用 energy 而不是 df
  • 嗨 - dplyr 库中的 group_by() 工作方式如下:group_by(data, var,...)。如果您使用%&gt;% 命令,您可以像这样将数据放在前面 - data %&gt;% group_by(variableInData)。将其分配给另一个变量:dfGroup &lt;- energy %&gt;% group_by(datetime) %&gt;% summarise(value) 您必须首先修复日期时间,就像您在之前的代码中所做的那样。干杯!注意&lt;- 运算符
【解决方案2】:

使用as.Date(),然后使用aggregate()

energy$Date <- as.Date(energy$Datetime)
aggregate(energy$value, by=list(energy$Date), sum)

编辑

Emma 对列名提出了很好的观点。您可以使用以下代码保留 aggregate 中的列名:

aggregate(energy["value"], by=energy["Date"], sum)

【讨论】:

  • 有时命名列名很有帮助。 aggr_energy &lt;-aggregate(energy$value, by=list(energy$Date), sum) colnames(aggr_energy) &lt;- c('date', 'medium', 'pageviews')
  • @Emma 或者更简单地说,aggregate(energy["value"], by=energy["Date"], sum),应该保留列名。
【解决方案3】:

使用数据表

Test$Datetime <- as.Date(Test$Datetime)
DT<- data.table(Test )
DT[,sum(value),by = Datetime]

     Datetime   V1
1: 2015-04-27 46.1
2: 2015-04-28  3.0

【讨论】:

    【解决方案4】:

    使用 tidyverse,特别是 lubridate 和 dplyr:

    library(lubridate)
    library(tidyverse)
    
    set.seed(10)
    df <- tibble(Datetime = sample(seq(as.POSIXct("2015-04-27"), as.POSIXct("2015-04-29"), by = "min"), 10),
                value = sample(1:100, 10)) %>%
      arrange(Datetime)
    
    df
    #> # A tibble: 10 x 2
    #>    Datetime            value
    #>    <dttm>              <int>
    #>  1 2015-04-27 04:04:00    35
    #>  2 2015-04-27 10:48:00    41
    #>  3 2015-04-27 13:02:00    25
    #>  4 2015-04-27 13:09:00     5
    #>  5 2015-04-27 14:43:00    57
    #>  6 2015-04-27 20:29:00    12
    #>  7 2015-04-27 20:34:00    77
    #>  8 2015-04-28 00:22:00    66
    #>  9 2015-04-28 05:29:00    37
    #> 10 2015-04-28 09:14:00    58
    
    df %>%
      mutate(date_col = date(Datetime)) %>%
      group_by(date_col) %>%
      summarize(value = sum(value))
    #> # A tibble: 2 x 2
    #>   date_col   value
    #>   <date>     <int>
    #> 1 2015-04-27   252
    #> 2 2015-04-28   161
    

    reprex package (v0.2.0) 于 2018 年 8 月 1 日创建。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-22
      • 1970-01-01
      • 1970-01-01
      • 2019-08-09
      • 1970-01-01
      相关资源
      最近更新 更多