R语言中对V1-V250列按规则过滤数据的问题求助
分列组数值过滤问题解决方案
你用filter()函数得到异常结果,核心原因是filter()用于筛选整行,但你的需求是针对不同列组处理列内值(或按列组条件筛选行),逻辑不匹配导致结果偏差。以下分两种常见需求给出解决方案:
需求1:保留列内符合条件的值,不符合的设为NA
如果你的“过滤列”是指保留列内符合规则的值,将不符合的替换为缺失值(NA),用dplyr的mutate()结合across()批量处理:
library(dplyr) # 假设你的数据集名为df df_cleaned <- df %>% # V1-V30:仅保留缺失值,非缺失值设为NA mutate(across(V1:V30, ~ifelse(!is.na(.), NA, .))) %>% # V31-V60:保留0到1之间(含边界)的值,其余设为NA mutate(across(V31:V60, ~ifelse(between(., 0, 1), ., NA))) %>% # V61-V90:保留非负值,其余设为NA mutate(across(V61:V90, ~ifelse(. >= 0, ., NA))) %>% # V91-V120:保留非正值,其余设为NA mutate(across(V91:V120, ~ifelse(. <= 0, ., NA))) %>% # V121-V150:保留0到300之间(含边界)的值,其余设为NA mutate(across(V121:V150, ~ifelse(between(., 0, 300), ., NA))) %>% # V151-V250:仅保留缺失值,非缺失值设为NA mutate(across(V151:V250, ~ifelse(!is.na(.), NA, .)))
需求2:筛选满足所有列组条件的整行
如果你的目标是筛选出整行满足所有列组规则的观测(比如V1-V30全为缺失、V31-V60所有值都在0-1之间等),用filter()结合if_all()实现:
library(dplyr) df_filtered <- df %>% filter( # V1-V30所有列均为缺失 if_all(V1:V30, is.na), # V31-V60所有列的值在0-1之间且非缺失 if_all(V31:V60, ~between(., 0, 1) & !is.na(.)), # V61-V90所有列的值非负且非缺失 if_all(V61:V90, ~. >= 0 & !is.na(.)), # V91-V120所有列的值非正且非缺失 if_all(V91:V120, ~. <= 0 & !is.na(.)), # V121-V150所有列的值在0-300之间且非缺失 if_all(V121:V150, ~between(., 0, 300) & !is.na(.)), # V151-V250所有列均为缺失 if_all(V151:V250, is.na) )
如果之前用filter()时错误使用了if_any()(只要有一列满足就保留)而非if_all(),或者逻辑判断写反(比如把is.na()写成!is.na()),就会出现你遇到的“本该保留的观测被剔除、不该留的数据仍存在”的问题。
内容的提问来源于stack exchange,提问作者Umberto Deveza Malanga
相关产品推荐
相关产品推荐

