根据参考日期时间过滤、分类和创建新变量

时间:2021-04-30 19:12:44

标签: r date filtering tidyverse data-wrangling

我目前正在处理一个数据集,其中包含一些供水罐的记录,其中显示了 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")
        

非常感谢你们!

1 个答案:

答案 0 :(得分:2)

我们将 'DATE' 列转换为 Date 类(dmy - 来自 lubridate),arrange 按 'IDENT' 和 'DATE' 的行,按 'IDENT' 分组,根据'ERROR'的存在,使用case_when将'READ'值重新编码为'READ_PRIOR'和'POST_READ',删除'TYPE'中没有'ERROR'值的'IDENT'组,重塑为'宽”格式,带有 pivot_widerfill '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