【问题标题】:aggregate multiple variables based on id for different timestamp in R基于 id 为 R 中的不同时间戳聚合多个变量
【发布时间】:2019-11-19 00:36:28
【问题描述】:

我在计算数据中 2 个变量的平均值时遇到问题。我收集了如下所示的温度和速度。我想最小化数据并且只有hourly 读数(没有分钟)。我想根据timeday 对每个id 取temperaturespeed 的平均值。

ID    temp  Speed   Day    Hour    Minute    Latitude    Longitude
1      3      20    1      11      10      38.9294865  -77.2479055
1      5      25    1      11      30      38.9294865  -77.2479055
1      5      30    1      12      12      38.9294865  -77.2479055
1      6      20    1      12      40      38.9294865  -77.2479055
2      1      40    2      11      05      38.9294771  -77.2478712
2      5      30    2      11      50      38.9294771  -77.2478712
2      2      20    2      12      30      38.9294771  -77.2478712
2      8      10    2      12      40      38.9294771  -77.2478712

我想要的数据如下所示:

ID    temp  Speed   Day    Hour    Minute    Latitude    Longitude
1      4      22.5   1      11      00      38.9294865  -77.2479055
1      5.5    25     1      12      00      38.9294865  -77.2479055
2      3      30     2      11      00      38.9294771  -77.2478712
2      5      15     2      12      00      38.9294771  -77.2478712

我想过创建一个这样的小时和分钟列:

Data$HM <- as.date(with(Data, paste(Hour, Minute ,sep=":")), "%H:%M")

然后根据我正在考虑尝试此代码的新列:

AvrgData<- aggregate(Data[, 2:3], list(Data$HM), mean)

但是我的代码不正确。 任何建议将不胜感激! 我浏览了这些链接,但仍然无法获得我想要的结果。

How to average columns based on ID in R?

Merge three different columns into a date in R

谢谢

【问题讨论】:

  • 对于初学者来说,as.date 不是一个函数 - 试试as.Date。完成后,检查Data$HM 的结果 - R 中的日期不存储小时和分钟。尝试as.POSIXct 来获取日期/时间。或者根本不用担心日期转换,只需使用paste

标签: r timestamp mean


【解决方案1】:

使用aggregate,您可以获得tempSpeed 中的mean,按IDDayHourLatitudeLongitude 分组,并为Longitude 创建一个列值为 0。

transform(aggregate(cbind(temp, Speed)~ID + Day + Hour + Latitude + Longitude, 
          df, mean), Minute = 0)

#  ID Day Hour Latitude Longitude temp Speed Minute
#1  1   1   11    38.93    -77.25  4.0  22.5      0
#2  1   1   12    38.93    -77.25  5.5  25.0      0
#3  2   2   11    38.93    -77.25  3.0  35.0      0
#4  2   2   12    38.93    -77.25  5.0  15.0      0

dplyr 中实现的相同逻辑将是

library(dplyr)

df %>%
  group_by(ID, Day, Hour, Latitude, Longitude) %>%
  summarise_at(vars(temp, Speed), mean) %>%
  mutate(Minute = 0)

数据

df <- structure(list(ID = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), temp = c(3L, 
5L, 5L, 6L, 1L, 5L, 2L, 8L), Speed = c(20L, 25L, 30L, 20L, 40L, 
30L, 20L, 10L), Day = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), Hour = c(11L, 
11L, 12L, 12L, 11L, 11L, 12L, 12L), Minute = c(10L, 30L, 12L, 
40L, 5L, 50L, 30L, 40L), Latitude = c(38.9294865, 38.9294865, 
38.9294865, 38.9294865, 38.9294771, 38.9294771, 38.9294771, 38.9294771
), Longitude = c(-77.2479055, -77.2479055, -77.2479055, -77.2479055, 
-77.2478712, -77.2478712, -77.2478712, -77.2478712)), class = "data.frame", 
row.names = c(NA, -8L))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多