R语言多条件过滤数据框异常行问题求助
问题分析与解决方法
你的代码存在核心语法错误和逻辑偏差,才会出现过滤结果不符合预期的情况。
原代码的问题点
- 变量名非法:R语言中变量名不能使用横杠
-,data-cleaned需改为data_cleaned - 管道流内重复赋值
fdaten_bereinigt <- rohdaten_basis %>%完全破坏了数据流转逻辑,属于语法错误 - 两次
filter是取交集(要求行同时满足全9和全1,根本不存在这样的行),实际等于没过滤,或是语法错误导致了意外结果
正确的过滤实现
我们需要过滤掉「7列全为9」或者「7列全为1」的无效行,也就是保留既不全为9、也不全为1的有效行,用dplyr可以这样实现:
方法1:直接写条件(适合列数较少的场景)
data_cleaned <- data_raw %>% filter(!( (sociald_ties_strong == 9 & sociald_ties_weak == 9 & sociald_ties_secondorder == 9 & sociald_identity_lifestyle == 9 & sociald_identity_politics == 9 & sociald_vertical_socialcapital == 9 & sociald_vertical_networkcapital == 9) | (sociald_ties_strong == 1 & sociald_ties_weak == 1 & sociald_ties_secondorder == 1 & sociald_identity_lifestyle == 1 & sociald_identity_politics == 1 & sociald_vertical_socialcapital == 1 & sociald_vertical_networkcapital == 1) ))
方法2:用if_all简化代码(更简洁,扩展性更强)
把需要检查的7列存为向量,用if_all批量判断所有列是否满足条件,代码更清爽:
# 定义需要检查的目标列名 target_cols <- c( "sociald_ties_strong", "sociald_ties_weak", "sociald_ties_secondorder", "sociald_identity_lifestyle", "sociald_identity_politics", "sociald_vertical_socialcapital", "sociald_vertical_networkcapital" ) data_cleaned <- data_raw %>% filter(!(if_all(all_of(target_cols), ~ .x == 9) | if_all(all_of(target_cols), ~ .x == 1)))
逻辑说明
if_all(all_of(target_cols), ~ .x == 9):判断指定7列是否全部等于9if_all(all_of(target_cols), ~ .x ==1):判断指定7列是否全部等于1|表示「或」的逻辑,!表示取反,最终保留的是既不全为9、也不全为1的有效行
内容的提问来源于stack exchange,提问作者urcho
相关产品推荐
相关产品推荐

