R语言中无NA的STRATEGY列处理后出现NA的原因及占比计算
问题分析与解决方案
可能导致STRATEGY列出现NA的原因
- 拆分时的空白/空字符串被误转NA:原STRATEGY列可能存在肉眼不可见的空白(如空格、制表符)或仅含逗号的空值,
separate_rows拆分后生成空字符串,后续被统一转为NA; - 宽长表转换的匹配偏差:使用
pivot_wider时,若未指定values_fill参数,不同行的缺失匹配项会被填充为NA; - 批量处理空值时的范围错误:处理STRENGH/WEAKNESS列的NA时,误将STRATEGY列纳入转换范围(比如用
mutate_all(na_if, "")而非mutate_at(vars(STRENGH, WEAKNESS), na_if, "")); - 拆分分隔符的逻辑问题:若STRATEGY列的多选项用逗号+空格分隔(如"A, B, C"),
separate_rows默认按逗号拆分后会生成带空格的选项,后续转宽时可能因匹配不上原类别产生NA。
针对性解决方案
1. 检查并清理原STRATEGY列的隐藏空白
先确认原数据中STRATEGY列的真实内容,排除空白/空字符串:
# 查看STRATEGY列的唯一值(含空白) unique(df$STRATEGY) # 清理空白并替换空字符串为有效标识(避免后续转NA) df_clean <- df %>% mutate(STRATEGY = str_squish(STRATEGY)) %>% # 去除前后空格和中间多余空格 mutate(STRATEGY = ifelse(STRATEGY == "", "无选择", STRATEGY)) # 空字符串替换为明确值
2. 修正多选项拆分与宽表转换逻辑
拆分时指定正确的分隔符,转宽时设置values_fill避免生成NA:
library(tidyr) library(dplyr) # 拆分多选项列(仅针对需要处理的列) df_long <- df_clean %>% separate_rows(c(STRATEGY, STRENGH, WEAKNESS), sep = ",\\s*") # 匹配逗号+任意空格 # 转宽表时指定values_fill,避免缺失匹配项生成NA df_wide <- df_long %>% pivot_wider( id_cols = c(ID, SCHOOL), # 保留核心标识列 names_from = STRATEGY, # 按STRATEGY选项生成列 values_from = STRATEGY, values_fn = length, values_fill = 0 # 缺失项填充0而非NA )
3. 精准处理指定列的NA
仅针对STRENGH和WEAKNESS列转换空值为NA,不影响STRATEGY:
df_processed <- df_long %>% mutate_at(vars(STRENGH, WEAKNESS), ~na_if(., "")) # 仅处理指定列的空字符串为NA
4. 计算各学校类型的STRATEGY选项占比
在确保STRATEGY无异常NA后,按学校类型统计占比:
strategy_ratio <- df_processed %>% filter(!is.na(STRATEGY)) %>% # 过滤掉可能残留的NA(若有) group_by(SCHOOL, STRATEGY) %>% summarise(count = n()) %>% mutate(ratio = count / sum(count)) %>% ungroup()
验证方法
处理后检查STRATEGY列的NA数量:
sum(is.na(df_processed$STRATEGY))
内容的提问来源于stack exchange,提问作者Larissa Cury
相关产品推荐
相关产品推荐

