根据参考日期时间过滤、分类和创建新变量
Filtering , classifying and creating a new variable based on a reference datetime
我目前正在处理一个包含一些供水水箱记录的数据集,该数据集显示了 DATE 5 个不同水箱的技术检查(IDENT) 以及记录的检查的 TYPE 只能有两个值“READ”,当水箱工作正常时,“ERROR”,否则表现不佳。
IDENT
DATE
TYPE
X3
30/04/2021
ERROR
X1
1/05/2021
READ
X1
2/05/2021
ERROR
X4
3/05/2021
READ
X9
4/05/2021
ERROR
X6
5/05/2021
READ
X1
6/05/2021
READ
X3
7/05/2021
ERROR
X3
8/05/2021
READ
我必须创建一个可以过滤的数据框,并且 select 每个 TYPE="ERROR" DATE 每个水箱(是否没有错误记录在指定坦克的日期设置不需要显示它)并显示每个坦克错误之前的最新 TYPE="READ" DATE 以及最新的 DATE 在每个坦克的错误日期之后,为了说明我要实现这个 table:
| IDENT | READ_PRIOR | ERROR | POST_READ |
|:-----:|:----------:|:----------:|:---------:|
| X3 | NA | 30/04/2021 | 8/05/2021 |
| X3 | NA | 7/05/2021 | 8/05/2021 |
| X1 | 1/05/2021 | 2/05/2021 | 6/05/2021 |
| X9 | NA | 4/05/2021 | NA |
我尝试了什么?
我已经开始通过按日期按时间顺序排列数据集并使用 tidyverse 包按 IDENT 分组来解决这个问题,我也可以 select 使用 [=] 组的最新日期42=] 函数,但我的问题是我似乎无法找到一种方法来成功过滤或 select 坦克在引用 TYPE="ERROR" 之前和之后的最新日期,所以这就是我撞头的地方。非常感谢你们帮我安排我真的很感激。
代码:
df<- tibble::tribble(
~IDENT ~DATE ~TYPE,
"X3", "30/04/2021", "ERROR",
"X1", "1/05/2021", "READ",
"X1", "2/05/2021", "ERROR",
"X4", "3/05/2021", "READ",
"X9", "4/05/2021", "ERROR",
"X6", "5/05/2021", "READ",
"X1", "6/05/2021", "READ",
"X3", "7/05/2021", "ERROR",
"X3", "8/05/2021", "READ")
非常感谢你们!
我们将 'DATE' 列转换为 Date
class(dmy
- 来自 lubridate),arrange
行 'IDENT' 和'DATE',按 'IDENT' 分组,根据 'ERROR' 的存在将 'READ' 值重新编码为 'READ_PRIOR' 和 'POST_READ' 以及 case_when
, 删除 'TYPE' 中没有 'ERROR' 值的 'IDENT' 组,将 pivot_wider
和 fill
中的值重塑为 'wide' 格式 'POST_READ' 每个 'IDENT'
具有非 NA 相邻值
library(dplyr)
library(tidyr)
library(data.table)
library(lubridate)
df %>%
mutate(DATE = dmy(DATE)) %>%
arrange(IDENT, DATE) %>%
group_by(IDENT) %>%
mutate(TYPE = case_when(TYPE == 'READ' & lead(TYPE) == 'ERROR'
~ 'READ_PRIOR', TYPE == 'READ' ~ 'POST_READ', TRUE ~ TYPE)) %>%
filter('ERROR' %in% TYPE) %>%
mutate(rn = rowid(IDENT, TYPE)) %>%
pivot_wider(names_from = TYPE, values_from = DATE) %>%
fill(POST_READ) %>%
ungroup %>%
select(-rn)
-输出
# A tibble: 4 x 4
# IDENT READ_PRIOR ERROR POST_READ
# <chr> <date> <date> <date>
#1 X1 2021-05-01 2021-05-02 2021-05-06
#2 X3 NA 2021-04-30 2021-05-08
#3 X3 NA 2021-05-07 2021-05-08
#4 X9 NA 2021-05-04 NA
我目前正在处理一个包含一些供水水箱记录的数据集,该数据集显示了 DATE 5 个不同水箱的技术检查(IDENT) 以及记录的检查的 TYPE 只能有两个值“READ”,当水箱工作正常时,“ERROR”,否则表现不佳。
IDENT | DATE | TYPE |
---|---|---|
X3 | 30/04/2021 | ERROR |
X1 | 1/05/2021 | READ |
X1 | 2/05/2021 | ERROR |
X4 | 3/05/2021 | READ |
X9 | 4/05/2021 | ERROR |
X6 | 5/05/2021 | READ |
X1 | 6/05/2021 | READ |
X3 | 7/05/2021 | ERROR |
X3 | 8/05/2021 | READ |
我必须创建一个可以过滤的数据框,并且 select 每个 TYPE="ERROR" DATE 每个水箱(是否没有错误记录在指定坦克的日期设置不需要显示它)并显示每个坦克错误之前的最新 TYPE="READ" DATE 以及最新的 DATE 在每个坦克的错误日期之后,为了说明我要实现这个 table:
| IDENT | READ_PRIOR | ERROR | POST_READ |
|:-----:|:----------:|:----------:|:---------:|
| X3 | NA | 30/04/2021 | 8/05/2021 |
| X3 | NA | 7/05/2021 | 8/05/2021 |
| X1 | 1/05/2021 | 2/05/2021 | 6/05/2021 |
| X9 | NA | 4/05/2021 | NA |
我尝试了什么?
我已经开始通过按日期按时间顺序排列数据集并使用 tidyverse 包按 IDENT 分组来解决这个问题,我也可以 select 使用 [=] 组的最新日期42=] 函数,但我的问题是我似乎无法找到一种方法来成功过滤或 select 坦克在引用 TYPE="ERROR" 之前和之后的最新日期,所以这就是我撞头的地方。非常感谢你们帮我安排我真的很感激。
代码:
df<- tibble::tribble(
~IDENT ~DATE ~TYPE,
"X3", "30/04/2021", "ERROR",
"X1", "1/05/2021", "READ",
"X1", "2/05/2021", "ERROR",
"X4", "3/05/2021", "READ",
"X9", "4/05/2021", "ERROR",
"X6", "5/05/2021", "READ",
"X1", "6/05/2021", "READ",
"X3", "7/05/2021", "ERROR",
"X3", "8/05/2021", "READ")
非常感谢你们!
我们将 'DATE' 列转换为 Date
class(dmy
- 来自 lubridate),arrange
行 'IDENT' 和'DATE',按 'IDENT' 分组,根据 'ERROR' 的存在将 'READ' 值重新编码为 'READ_PRIOR' 和 'POST_READ' 以及 case_when
, 删除 'TYPE' 中没有 'ERROR' 值的 'IDENT' 组,将 pivot_wider
和 fill
中的值重塑为 'wide' 格式 'POST_READ' 每个 'IDENT'
library(dplyr)
library(tidyr)
library(data.table)
library(lubridate)
df %>%
mutate(DATE = dmy(DATE)) %>%
arrange(IDENT, DATE) %>%
group_by(IDENT) %>%
mutate(TYPE = case_when(TYPE == 'READ' & lead(TYPE) == 'ERROR'
~ 'READ_PRIOR', TYPE == 'READ' ~ 'POST_READ', TRUE ~ TYPE)) %>%
filter('ERROR' %in% TYPE) %>%
mutate(rn = rowid(IDENT, TYPE)) %>%
pivot_wider(names_from = TYPE, values_from = DATE) %>%
fill(POST_READ) %>%
ungroup %>%
select(-rn)
-输出
# A tibble: 4 x 4
# IDENT READ_PRIOR ERROR POST_READ
# <chr> <date> <date> <date>
#1 X1 2021-05-01 2021-05-02 2021-05-06
#2 X3 NA 2021-04-30 2021-05-08
#3 X3 NA 2021-05-07 2021-05-08
#4 X9 NA 2021-05-04 NA