首页 > 解决方案 > 根据实际未发生更新但保留第一个实例的日期和时间删除行

问题描述

我在试图解决这个问题时遇到了困难,希望有人能提供帮助。我正在尝试实现一种过滤此数据集的方法,该数据集反映了带有时间戳的自行车站占用数据。

   ID  Time                   Bike.Availability
1  2   01/04/2020  04:31:16   11
2  2   01/04/2020  04:40:07   11
3  2   01/04/2020  04:50:15   10
4  2   01/04/2020  04:57:10   10
5  2   01/04/2020  05:07:19    9
6  2   01/04/2020  05:19:38   10
7  2   01/04/2020  05:29:47   10
8  2   01/04/2020  06:43:54   11

我想删除 Bike.Availability 没有变化的行,只保留第一个实例。我希望生成的数据集如下所示:

   ID  Time                   Bike.Availability
1  2   01/04/2020  04:31:16   11
2  2   01/04/2020  04:50:15   10
3  2   01/04/2020  05:07:19    9
4  2   01/04/2020  05:19:38   10
5  2   01/04/2020  06:43:54   11

我已经转换了时间戳:

bike_data$Time <- as.POSIXct(bike_data$Time,format="%Y-%m-%d %H:%M:%S")

我尝试了不同的变体:

library(dplyr)
bike_data %>%
 group_by(Time) %>%
 arrange(Bike.Availability) %>%
 top_n(1)

任何帮助或反馈将不胜感激。

标签: r

解决方案


我们按 'Bike.Availability' 的 'ID' 和 run-length-id 进行分组,即它根据 'Bike.Availability' 的相邻元素的相似性创建一个分组索引,然后slice在第一行slice_head指定n = 1

library(dplyr)
library(data.table)
bike_data %>%     
 group_by(ID, grp = rleid(Bike.Availability)) %>%
 slice_head(n = 1) %>%
 ungroup %>%
 select(-grp)

-输出

# A tibble: 5 x 3
#     ID Time                 Bike.Availability
#  <int> <chr>                            <int>
#1     2 01/04/2020  04:31:16                11
#2     2 01/04/2020  04:50:15                10
#3     2 01/04/2020  05:07:19                 9
#4     2 01/04/2020  05:19:38                10
#5     2 01/04/2020  06:43:54                11

按“时间”列分组将创建每个组具有单个观察值的组(基于“时间”中显示的值),因此top_n(1)返回原始数据集而不是子集

数据

bike_data <- structure(list(ID = c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L),
Time = c("01/04/2020  04:31:16", 
"01/04/2020  04:40:07", "01/04/2020  04:50:15", "01/04/2020  04:57:10", 
"01/04/2020  05:07:19", "01/04/2020  05:19:38", "01/04/2020  05:29:47", 
"01/04/2020  06:43:54"), Bike.Availability = c(11L, 11L, 10L, 
10L, 9L, 10L, 10L, 11L)), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8"))

推荐阅读