尝试过滤数据框 - 寻找另一个变量变化有限的设定时间段
Trying to filter a data frame - looking for set time periods where there is limited variation in another variable
我有一个包含多列的数据框,它们按时间列排序。每秒都有一个时间戳。我想在另一个变量变化有限的 1 分钟内搜索数据框。例如,我希望数据框中的每一分钟 TWS(真实风速)的变化不超过 5 节。这 1 分钟的时间也不应重叠。
一旦我们有了 1 分钟的部分,就创建另一个数据框,将每分钟的数据平均成行。
这里是数据的头部
Date Time Lat Lon AWA AWS TWA TWS
1 19/10/2018 2019-02-11 12:06:16 35.8952 14.5 -99.7 8.42 -99.7 8.42
2 19/10/2018 2019-02-11 12:06:17 35.8952 14.5 -99.1 8.24 -99.1 8.24
3 19/10/2018 2019-02-11 12:06:18 35.8952 14.5 -99.2 7.34 -99.2 7.34
4 19/10/2018 2019-02-11 12:06:19 35.8952 14.5 -99.6 6.87 -99.6 6.87
5 19/10/2018 2019-02-11 12:06:20 35.8952 14.5 -101.1 8.85 -101.1 8.85
6 19/10/2018 2019-02-11 12:06:21 35.8952 14.5 -101.6 9.39 -101.6 9.39
library(dplyr)
library(lubridate)
df %>%
mutate(Date=as.Date(Date), Time=ymd_hms(Time)) %>%
group_by(gr=minute(Time)) %>%
mutate(flag=max(TWS,na.rm=TRUE)-min(TWS,na.rm=TRUE)) %>%
filter(flag<5) %>%
mutate_all(.,mean,na.rm=TRUE) %>% distinct()
# A tibble: 1 x 10
# Groups: gr [1]
Date Time Lat Lon AWA AWS TWA TWS gr flag
<date> <dttm> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <int> <dbl>
1 0019-10-20 2019-02-11 12:06:17 35.9 14.5 -99.3 8. -99.3 8. 6 1.08
对于每组元素之间的变化,我们可以使用dplyr::lag
:
... mutate(flag=TWS-lag(TWS, default = first(TWS))) %>%
filter(all(abs(flag)<5)) %>% mutate_all(.,mean,na.rm=TRUE) %>% distinct()
数据
df <- read.table(text = "
Date Time Lat Lon AWA AWS TWA TWS
1 '19/10/2018' '2019-02-11 12:06:16' 35.8952 14.5 -99.7 8.42 -99.7 8.42
2 '19/10/2018' '2019-02-11 12:06:17' 35.8952 14.5 -99.1 8.24 -99.1 8.24
3 '19/10/2018' '2019-02-11 12:06:18' 35.8952 14.5 -99.2 7.34 -99.2 7.34
4 '19/10/2018' '2019-02-11 12:07:19' 35.8952 14.5 -99.6 6.87 -99.6 6.87
5 '19/10/2018' '2019-02-11 12:07:20' 35.8952 14.5 -101.1 8.85 -101.1 8.85
6 '19/10/2018' '2019-02-11 12:07:21' 35.8952 14.5 -101.6 9.39 -101.6 16.39
", header=TRUE)
我有一个包含多列的数据框,它们按时间列排序。每秒都有一个时间戳。我想在另一个变量变化有限的 1 分钟内搜索数据框。例如,我希望数据框中的每一分钟 TWS(真实风速)的变化不超过 5 节。这 1 分钟的时间也不应重叠。
一旦我们有了 1 分钟的部分,就创建另一个数据框,将每分钟的数据平均成行。
这里是数据的头部
Date Time Lat Lon AWA AWS TWA TWS
1 19/10/2018 2019-02-11 12:06:16 35.8952 14.5 -99.7 8.42 -99.7 8.42
2 19/10/2018 2019-02-11 12:06:17 35.8952 14.5 -99.1 8.24 -99.1 8.24
3 19/10/2018 2019-02-11 12:06:18 35.8952 14.5 -99.2 7.34 -99.2 7.34
4 19/10/2018 2019-02-11 12:06:19 35.8952 14.5 -99.6 6.87 -99.6 6.87
5 19/10/2018 2019-02-11 12:06:20 35.8952 14.5 -101.1 8.85 -101.1 8.85
6 19/10/2018 2019-02-11 12:06:21 35.8952 14.5 -101.6 9.39 -101.6 9.39
library(dplyr)
library(lubridate)
df %>%
mutate(Date=as.Date(Date), Time=ymd_hms(Time)) %>%
group_by(gr=minute(Time)) %>%
mutate(flag=max(TWS,na.rm=TRUE)-min(TWS,na.rm=TRUE)) %>%
filter(flag<5) %>%
mutate_all(.,mean,na.rm=TRUE) %>% distinct()
# A tibble: 1 x 10
# Groups: gr [1]
Date Time Lat Lon AWA AWS TWA TWS gr flag
<date> <dttm> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <int> <dbl>
1 0019-10-20 2019-02-11 12:06:17 35.9 14.5 -99.3 8. -99.3 8. 6 1.08
对于每组元素之间的变化,我们可以使用dplyr::lag
:
... mutate(flag=TWS-lag(TWS, default = first(TWS))) %>%
filter(all(abs(flag)<5)) %>% mutate_all(.,mean,na.rm=TRUE) %>% distinct()
数据
df <- read.table(text = "
Date Time Lat Lon AWA AWS TWA TWS
1 '19/10/2018' '2019-02-11 12:06:16' 35.8952 14.5 -99.7 8.42 -99.7 8.42
2 '19/10/2018' '2019-02-11 12:06:17' 35.8952 14.5 -99.1 8.24 -99.1 8.24
3 '19/10/2018' '2019-02-11 12:06:18' 35.8952 14.5 -99.2 7.34 -99.2 7.34
4 '19/10/2018' '2019-02-11 12:07:19' 35.8952 14.5 -99.6 6.87 -99.6 6.87
5 '19/10/2018' '2019-02-11 12:07:20' 35.8952 14.5 -101.1 8.85 -101.1 8.85
6 '19/10/2018' '2019-02-11 12:07:21' 35.8952 14.5 -101.6 9.39 -101.6 16.39
", header=TRUE)