我目前正在处理一个数据集,其中包含一些供水罐的记录,其中显示了 5 个不同罐 (IDENT) 的技术检查的日期以及TYPE 记录的检查类型,当储罐正常工作时只能有两个值“READ”,否则性能不佳时只能有“ERROR”。
IDENT | 日期 | TYPE |
---|---|---|
X3 | 30/04/2021 | 错误 |
X1 | 1/05/2021 | 阅读 |
X1 | 2/05/2021 | 错误 |
X4 | 3/05/2021 | 阅读 |
X9 | 4/05/2021 | 错误 |
X6 | 5/05/2021 | 阅读 |
X1 | 6/05/2021 | 阅读 |
X3 | 7/05/2021 | 错误 |
X3 | 8/05/2021 | 阅读 |
我必须创建一个数据框,该数据框可以过滤和选择每个水箱的每个 TYPE="ERROR" DATE(指定水箱的日期集上是否没有记录错误是没有必要的)显示它)并显示每个坦克的错误之前的最新 TYPE="READ" DATE 以及每个坦克的错误日期之后的最新DATE,以说明我要实现这张表:
| 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 分组,我也可以使用 top_n 函数为组选择最新的日期,但我的问题是我似乎无法找到一种方法在参考 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")
非常感谢你们!
答案 0 :(得分:2)
我们将 'DATE' 列转换为 Date
类(dmy
- 来自 lubridate),arrange
按 'IDENT' 和 'DATE' 的行,按 'IDENT' 分组,根据'ERROR'的存在,使用case_when
将'READ'值重新编码为'READ_PRIOR'和'POST_READ',删除'TYPE'中没有'ERROR'值的'IDENT'组,重塑为'宽”格式,带有 pivot_wider
和 fill
'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