R语言中按时间条件删除数据行无效,求原因及解决方法
问题排查与解决
问题原因
你创建的模拟数据中,date_time、date_time1、date_time2实际是字符型(character),并非你所说的POSIXct格式。字符串比较是按字符顺序执行的,而非时间先后逻辑,导致你的条件判断无法正确识别需要删除的行。
解决步骤
- 将字符型日期列转换为POSIXct格式,让R能按时间逻辑进行比较;
- 直接通过条件子集化筛选出保留的行(无需额外创建
delete列,简化代码)。
修正后代码示例
方式1:先创建数据框再转换格式
# 原模拟数据框 final <- data.frame (id = c(1,2,3,4,5,6,7,8), date_time = c('2022-07-01 12:01:00', '2022-07-01 12:02:00', '2022-07-01 12:03:00', '2022-07-01 12:04:00', '2022-07-01 12:05:00', '2022-07-01 12:06:00', '2022-07-01 12:07:00', '2022-07-01 12:08:00'), date_time1 = c('2022-07-01 12:04:00', '2022-07-01 12:04:00', '2022-07-01 12:04:00', '2022-07-01 12:04:00', '2022-07-01 12:04:00', '2022-07-01 12:04:00', '2022-07-01 12:04:00', '2022-07-01 12:04:00'), date_time2 = c('2022-07-01 12:07:00', '2022-07-01 12:07:00', '2022-07-01 12:07:00', '2022-07-01 12:07:00', '2022-07-01 12:07:00', '2022-07-01 12:07:00', '2022-07-01 12:07:00', '2022-07-01 12:07:00')) # 转换为POSIXct格式 final$date_time <- as.POSIXct(final$date_time) final$date_time1 <- as.POSIXct(final$date_time1) final$date_time2 <- as.POSIXct(final$date_time2) # 筛选保留的行 filtered_final <- final[!(final$date_time > final$date_time1 & final$date_time < final$date_time2), ]
方式2:创建数据框时直接指定POSIXct格式
# 创建数据框时直接转换日期格式 final <- data.frame ( id = c(1,2,3,4,5,6,7,8), date_time = as.POSIXct(c('2022-07-01 12:01:00', '2022-07-01 12:02:00', '2022-07-01 12:03:00', '2022-07-01 12:04:00', '2022-07-01 12:05:00', '2022-07-01 12:06:00', '2022-07-01 12:07:00', '2022-07-01 12:08:00')), date_time1 = as.POSIXct(c('2022-07-01 12:04:00', '2022-07-01 12:04:00', '2022-07-01 12:04:00', '2022-07-01 12:04:00', '2022-07-01 12:04:00', '2022-07-01 12:04:00', '2022-07-01 12:04:00', '2022-07-01 12:04:00')), date_time2 = as.POSIXct(c('2022-07-01 12:07:00', '2022-07-01 12:07:00', '2022-07-01 12:07:00', '2022-07-01 12:07:00', '2022-07-01 12:07:00', '2022-07-01 12:07:00', '2022-07-01 12:07:00', '2022-07-01 12:07:00')) ) # 筛选行 filtered_final <- final[!(final$date_time > final$date_time1 & final$date_time < final$date_time2), ]
运行上述代码后,filtered_final将自动移除id为5、6的行,符合预期需求。
内容的提问来源于stack exchange,提问作者Vergriffene
相关产品推荐
相关产品推荐

