R语言处理位置数据时删除连续超3行/3小时的NA值所在行
R实现过滤连续超过3个NA的行的方法
核心依赖包
你需要安装并加载如下包:
# 安装依赖(首次运行执行) install.packages(c("tidyverse", "lubridate")) # 加载包 library(tidyverse) library(lubridate)
实现代码
基于你已经构建好的原始数据,完整处理代码如下:
df_processed <- df %>% # 合并日期时间列 unite(datetime, date, time, sep = ' ') %>% mutate(datetime = ymd_hms(datetime)) %>% # 按id分组,每个id的时间序列独立计算 group_by(id) %>% # 给连续的NA/非NA段标记唯一分组ID mutate(na_group = consecutive_id(is.na(lat))) %>% # 统计每个连续段的行数 add_count(na_group, name = "group_length") %>% # 过滤规则:仅删除「是NA且连续长度超过3」的行 filter(!(is.na(lat) & group_length > 3)) %>% # 清理辅助列得到最终结果 ungroup() %>% select(-na_group, -group_length)
低版本dplyr兼容方案
如果你使用的dplyr版本低于1.1.0,没有内置consecutive_id函数,可以用data.table的rleid函数替代:
# 先安装加载data.table install.packages("data.table") library(data.table) df_processed <- df %>% unite(datetime, date, time, sep = ' ') %>% mutate(datetime = ymd_hms(datetime)) %>% group_by(id) %>% # 替换为rleid函数 mutate(na_group = rleid(is.na(lat))) %>% add_count(na_group, name = "group_length") %>% filter(!(is.na(lat) & group_length > 3)) %>% ungroup() %>% select(-na_group, -group_length)
补充说明
如果你的数据存在经纬度单独为NA的情况,可将判断条件is.na(lat)调整为is.na(lat) | is.na(lon)即可适配。处理后剩余的NA段长度均≤3,你可以直接对这部分数据做插值运算。
内容的提问来源于stack exchange,提问作者cgxytf
相关产品推荐
相关产品推荐

