R语言中filter函数为何删除了所有观测值?
问题原因排查及解决思路
以下是导致filter(INDUSTRY_CODE == "C" | INDUSTRY_CODE == "F")删除所有观测值的常见原因及对应排查/解决方法:
INDUSTRY_CODE存在空格或不可见字符
用separate拆分后,INDUSTRY_CODE可能附带前导、后导空格或其他不可见字符(比如制表符),直接用== "C"精准匹配会失效。
排查代码:# 先分步运行到filter前的步骤,查看INDUSTRY_CODE的所有唯一值 step3 <- bres %>% separate(col = "INDUSTRY_NAME", into = c("INDUSTRY_CODE", "INDUSTRY_NAME"), sep = ":") %>% pivot_wider(names_from = EMPLOYMENT_STATUS_NAME, values_from = OBS_VALUE) %>% mutate(SELF_EMPLOYED = (Full_time_employees + Part_time_employees) - Employment) unique(step3$INDUSTRY_CODE) # 检查每个值的字符长度(如果长度大于1,大概率有空格) nchar(step3$INDUSTRY_CODE)解决方法:在拆分后添加去空格处理:
bres %>% separate(col = "INDUSTRY_NAME", into = c("INDUSTRY_CODE", "INDUSTRY_NAME"), sep = ":") %>% mutate(INDUSTRY_CODE = trimws(INDUSTRY_CODE)) %>% # 新增去空格步骤 pivot_wider(names_from = EMPLOYMENT_STATUS_NAME, values_from = OBS_VALUE) %>% mutate(SELF_EMPLOYED = (Full_time_employees + Part_time_employees) - Employment) %>% filter(INDUSTRY_CODE == "C" | INDUSTRY_CODE == "F") %>% select(-INDUSTRY_CODE)separate拆分逻辑不符合原始数据格式
原始INDUSTRY_NAME列的分隔符可能不是单纯的:,比如是:(带空格的冒号),或者部分行没有冒号,导致拆分后INDUSTRY_CODE不是预期的"C"/"F",甚至变成NA。
排查代码:# 查看拆分后的前10行数据,确认INDUSTRY_CODE是否正确 head(bres %>% separate(col = "INDUSTRY_NAME", into = c("INDUSTRY_CODE", "INDUSTRY_NAME"), sep = ":"), 10)解决方法:调整分隔符匹配规则,比如匹配带空格的冒号:
separate(col = "INDUSTRY_NAME", into = c("INDUSTRY_CODE", "INDUSTRY_NAME"), sep = "\\s*:\\s*")若部分行没有冒号,可添加
extra = "merge"避免拆分失败:separate(col = "INDUSTRY_NAME", into = c("INDUSTRY_CODE", "INDUSTRY_NAME"), sep = ":", extra = "merge")大小写不匹配
若原始数据中INDUSTRY_CODE是小写的"c"/"f",而代码用大写匹配,会导致无匹配结果。
解决方法:统一转换大小写后匹配:filter(tolower(INDUSTRY_CODE) %in% c("c", "f"))
内容的提问来源于stack exchange,提问作者luca
相关产品推荐
相关产品推荐

