如何筛选timeDiff超均值±2标准差的唯一ID全行列数据集子集并排序?
解决方法
你的代码问题出在逻辑判断的方式上——unique(myDataset$ID)返回的是唯一ID的向量,和后面的timeDiff条件做&运算时长度不匹配,而且逻辑上也不是先筛选符合条件的ID再提取全部行。按需求分两步走就清晰了:
步骤1:筛选出符合timeDiff条件的唯一ID
先找出所有timeDiff超出均值±2个标准差的行对应的ID,再去重得到要保留的ID列表:
# 先找出符合timeDiff条件的行的ID,再去重 target_ids <- unique(myDataset$ID[myDataset$timeDiff >= mean_time_diff_rounded + 2*sd_time_diff_rounded | myDataset$timeDiff <= mean_time_diff_rounded - 2*sd_time_diff_rounded])
步骤2:提取这些ID的全部行并排序
用筛选出的ID列表提取原数据集的所有对应行,再用order()按ID排序:
# 提取目标ID的所有行 data_subset <- myDataset[myDataset$ID %in% target_ids, ] # 按ID排序 data_subset_sorted <- data_subset[order(data_subset$ID), ]
如果用dplyr包会更简洁,代码可读性更高:
library(dplyr) data_subset_sorted <- myDataset %>% # 先标记出符合timeDiff条件的ID group_by(ID) %>% mutate(is_outlier = any(timeDiff >= mean_time_diff_rounded + 2*sd_time_diff_rounded | timeDiff <= mean_time_diff_rounded - 2*sd_time_diff_rounded)) %>% ungroup() %>% # 保留有异常值的ID的所有行 filter(is_outlier) %>% # 按ID排序 arrange(ID) %>% # 去掉临时标记列 select(-is_outlier)
这样就能得到你要的结果:所有满足timeDiff超出±2σ的唯一ID的全部行,且按ID排序的数据集。
内容的提问来源于stack exchange,提问作者athena45
相关产品推荐
相关产品推荐

