如何通过迭代方法或管道运算符删除嵌套数据集的极端异常值行
解决方案
你之前的代码失效核心原因是直接对嵌套的列表列做数值匹配,逻辑不成立。这里提供两种易上手的实现方案:
方案1:解嵌套过滤后重嵌套(新手友好,逻辑直观)
无需复杂迭代,通过管道流即可完成,适合中小体量数据集:
library(tidyverse) library(rstatix) # 1. 先提取所有极端异常值,保留可唯一匹配原始行的字段避免误删 extreme_outliers <- df_join %>% tidyr::unnest(recordings) %>% dplyr::group_by(clc) %>% rstatix::identify_outliers(sls_strength) %>% dplyr::filter(is.extreme == TRUE) %>% dplyr::select(clc, channel, subject_id, sls_strength) # 2. 反连接剔除极端值后,重新嵌套恢复原数据结构 df_join_clean <- df_join %>% tidyr::unnest(recordings) %>% dplyr::anti_join(extreme_outliers, by = c("clc", "channel", "subject_id", "sls_strength")) %>% tidyr::nest(recordings = c(subject_id, group, sxs, clc, sls_strength)) %>% dplyr::group_by(channel)
方案2:映射处理嵌套列(适合大数据集,无需全量解嵌套)
用purrr直接迭代嵌套的列表列,保留原始数据结构:
df_join_clean <- df_join %>% dplyr::mutate( recordings = purrr::pmap( list(channel, recordings), function(ch, df) { df %>% dplyr::group_by(clc) %>% rstatix::identify_outliers(sls_strength) %>% dplyr::filter(is.extreme == FALSE) %>% # 恢复原始列名,去掉异常值识别新增的标识列 dplyr::select(all_of(colnames(df))) } ) )
适配说明
如果你的实际数据集列名和构造示例不同(比如分组列叫sls、嵌套列叫data、数值列叫value),对应替换上述代码里的字段名即可。
内容的提问来源于stack exchange,提问作者12666727b9
相关产品推荐
相关产品推荐

