计算一天后值的平均变化
Calculate mean change in values one day later
我有一个包含值及其时间戳的数据框。数据如下所示:
library(lubridate)
df <- data.frame(date1= dmy_hms(c("01.08.2019 12:11:32", "01.05.2019 10:01:17")),
value1= c(60, 70),
date2= dmy_hms(c("01.08.2019 12:41:38", "01.05.2019 11:51:17")),
value2= c(80, 60),
date3= dmy_hms(c("02.08.2019 12:01:09", "02.05.2019 10:11:34")),
value3= c(10, 40),
date4= dmy_hms(c("02.08.2019 12:41:38", "02.05.2019 11:51:17")),
value4= c(30, 80))
df
date1 value1 date2 value2 date3 value3 date4 value4
1 2019-08-01 12:11:32 60 2019-08-01 12:41:38 80 2019-08-02 12:01:09 10 2019-08-02 12:41:38 30
2 2019-05-01 10:01:17 70 2019-05-01 11:51:17 60 2019-05-02 10:11:34 40 2019-05-02 11:51:17 80
我需要找出值在一天后如何变化,只关心小时。
上面数据的第一行:value1
(60
)和value2
(80
)都记录在12:XX:XX
点同一天,所以这一天 12:XX:XX
点的平均值是 70
。第二天12:XX:XX
点的平均值是20
。这意味着第一行的 -50
发生变化。
第二行:此处 value1
是 10:XX:XX
点的 70
,一天后 10:XX:XX
点的值为 40
,所以变化是 -30
。 11:XX:XX
点从一天到下一天的变化是 +20
。所以平均变化是 (-30 + 20)/2 = -5
.
因此,我的预期输出是
mean_change <- matrix(c(-50, -5), ncol= 1)
mean_change
[,1]
[1,] -50
[2,] -5
我会把数据结构改成long。至少对我来说,这使任务更加直观。
这是您要找的吗?
library(lubridate)
library(dplyr)
df <- data.frame(date1= dmy_hms(c("01.08.2019 12:11:32", "01.05.2019 10:01:17")),
value1= c(60, 70),
date2= dmy_hms(c("01.08.2019 12:41:38", "01.05.2019 11:51:17")),
value2= c(80, 60),
date3= dmy_hms(c("02.08.2019 12:01:09", "02.05.2019 10:11:34")),
value3= c(10, 40),
date4= dmy_hms(c("02.08.2019 12:41:38", "02.05.2019 11:51:17")),
value4= c(30, 80))
df
df.long <- as.data.frame(matrix(t(df), ncol=2, byrow=T))
df.long$Date <- as.Date(df.long$V1)
df.long$Time <- format(as.POSIXct(df.long$V1) ,format = "%H")
df.long <- df.long[c(2:4)]
df.long$V2 <- as.numeric(as.character(df.long$V2))
daychange <- df.long %>% group_by(Date, Time) %>% summarise(d.h.mean = mean(V2))
daychange$Date <- strftime(daychange$Date,format = "%Y-%m")
daychange %>% group_by(Date, Time) %>% mutate(change = d.h.mean-lag(d.h.mean))
# A tibble: 6 x 4
# Groups: Date, Time [3]
Date Time d.h.mean change
<chr> <chr> <dbl> <dbl>
1 2019-05 10 70 NA
2 2019-05 11 60 NA
3 2019-05 10 40 -30
4 2019-05 11 80 20
5 2019-08 12 70 NA
6 2019-08 12 20 -50
我有一个包含值及其时间戳的数据框。数据如下所示:
library(lubridate)
df <- data.frame(date1= dmy_hms(c("01.08.2019 12:11:32", "01.05.2019 10:01:17")),
value1= c(60, 70),
date2= dmy_hms(c("01.08.2019 12:41:38", "01.05.2019 11:51:17")),
value2= c(80, 60),
date3= dmy_hms(c("02.08.2019 12:01:09", "02.05.2019 10:11:34")),
value3= c(10, 40),
date4= dmy_hms(c("02.08.2019 12:41:38", "02.05.2019 11:51:17")),
value4= c(30, 80))
df
date1 value1 date2 value2 date3 value3 date4 value4
1 2019-08-01 12:11:32 60 2019-08-01 12:41:38 80 2019-08-02 12:01:09 10 2019-08-02 12:41:38 30
2 2019-05-01 10:01:17 70 2019-05-01 11:51:17 60 2019-05-02 10:11:34 40 2019-05-02 11:51:17 80
我需要找出值在一天后如何变化,只关心小时。
上面数据的第一行:value1
(60
)和value2
(80
)都记录在12:XX:XX
点同一天,所以这一天 12:XX:XX
点的平均值是 70
。第二天12:XX:XX
点的平均值是20
。这意味着第一行的 -50
发生变化。
第二行:此处 value1
是 10:XX:XX
点的 70
,一天后 10:XX:XX
点的值为 40
,所以变化是 -30
。 11:XX:XX
点从一天到下一天的变化是 +20
。所以平均变化是 (-30 + 20)/2 = -5
.
因此,我的预期输出是
mean_change <- matrix(c(-50, -5), ncol= 1)
mean_change
[,1]
[1,] -50
[2,] -5
我会把数据结构改成long。至少对我来说,这使任务更加直观。 这是您要找的吗?
library(lubridate)
library(dplyr)
df <- data.frame(date1= dmy_hms(c("01.08.2019 12:11:32", "01.05.2019 10:01:17")),
value1= c(60, 70),
date2= dmy_hms(c("01.08.2019 12:41:38", "01.05.2019 11:51:17")),
value2= c(80, 60),
date3= dmy_hms(c("02.08.2019 12:01:09", "02.05.2019 10:11:34")),
value3= c(10, 40),
date4= dmy_hms(c("02.08.2019 12:41:38", "02.05.2019 11:51:17")),
value4= c(30, 80))
df
df.long <- as.data.frame(matrix(t(df), ncol=2, byrow=T))
df.long$Date <- as.Date(df.long$V1)
df.long$Time <- format(as.POSIXct(df.long$V1) ,format = "%H")
df.long <- df.long[c(2:4)]
df.long$V2 <- as.numeric(as.character(df.long$V2))
daychange <- df.long %>% group_by(Date, Time) %>% summarise(d.h.mean = mean(V2))
daychange$Date <- strftime(daychange$Date,format = "%Y-%m")
daychange %>% group_by(Date, Time) %>% mutate(change = d.h.mean-lag(d.h.mean))
# A tibble: 6 x 4
# Groups: Date, Time [3]
Date Time d.h.mean change
<chr> <chr> <dbl> <dbl>
1 2019-05 10 70 NA
2 2019-05 11 60 NA
3 2019-05 10 40 -30
4 2019-05 11 80 20
5 2019-08 12 70 NA
6 2019-08 12 20 -50