R语言将18水平教育因子重编码为7分类时触发recursive indexing报错
直接触发报错的核心原因
你代码首行的取子集语法错误,是触发Error in .subset2(x, i, exact = exact) : recursive indexing failed at level 2的根本诱因:
- R语言中,用
[[ ]]从数据框提取列时,括号内必须传入列名的字符串常量,而bes$education本身是education列存储的18个水平的取值向量,不是列名。相当于你把一长串分类标签塞给了索引位置,R会尝试逐层递归匹配这些标签对应的列,最终因为找不到匹配项抛出递归索引失败的错误。 - 退一步讲,就算你把取列语法修正为
bes[["education"]],原代码的逻辑也存在缺陷:管道仅将提取出来的向量传入recode()处理,处理完成后结果是一个独立的临时向量,没有通过赋值回写到bes数据框的对应列里,你后续查看原数据时根本看不到变量的变化,这也是你反复尝试不同函数都没有得到预期效果的重要原因。
原代码存在的其他匹配陷阱
就算修正了上述取列逻辑,以下细节问题也会导致重编码后大量值变为NA:
- 新分类标签和你最初的目标定义不匹配:原代码里将研究生学历标为
Postgrad、其他类标为Other,和你要求的7个水平(no qualification、GCSE D-G、GCSE A*-C、A Level、Undergraduate、Postgraduate、其他)不一致。 - 匹配字符串里残留网页转义字符:原代码写的
City&Guilds是网页爬取过程中生成的HTML转义内容,实际因子水平存储的是City&Guilds,用带&的字符串完全匹配不上真实水平。 - 字符串存在多余的尾随空格:原代码里
'A level or equivalent '末尾多了一个空格,如果实际因子水平没有这个空格,也会匹配失败。
修正后的可运行代码
# 加载dplyr包,提供recode、mutate等函数 library(dplyr) # 对education变量执行重编码,结果回写到原数据框 bes <- bes %>% mutate( # 直接在数据框上下文内引用education列,不需要手动写取子集语法 education = recode( education, "No qualification" = "no qualification", "GCSE D-G, CSE grades 2-5, O level D-E" = "GCSE D-G", "Youth training certificate, skill seekers" = "GCSE D-G", "Clerical and commercial qualifications" = "GCSE D-G", "GCSE A*-C, CSE grade 1, O level grade A-C" = "GCSE A*-C", "Scottish Standard grades, Ordinary bands" = "GCSE A*-C", "Recognised trade apprenticeship" = "GCSE A*-C", "City&Guilds level 1, NVQ/SVQ 1 and equivalent" = "GCSE A*-C", "A level or equivalent" = "A Level", "Scottish Higher or equivalent" = "A Level", "City&Guilds level 2, NVQ/SVQ 2 and equivalent" = "A Level", "HNC/HND, City&Guilds level 4, NVQ/SVQ 4/5" = "A Level", "ONC/OND, City&Guilds level 3, NVQ/SVQ 3" = "A Level", "Univ/poly diploma" = "Undergraduate", "First degree" = "Undergraduate", "Nursing qualification" = "Undergraduate", "Teaching qualification" = "Undergraduate", "Postgraduate degree" = "Postgraduate", "Other technical, professional or higher qualification" = "其他" ) %>% # 按照你指定的顺序设置因子水平,避免后续分析、绘图时水平顺序混乱 factor(levels = c("no qualification", "GCSE D-G", "GCSE A*-C", "A Level", "Undergraduate", "Postgraduate", "其他")) )
匹配异常的排查方法
如果运行代码后发现有大量值被识别为NA,先执行以下命令打印出education列实际存储的所有因子水平,和你写的匹配字符串逐行比对,找出转义字符、尾随空格、拼写不一致的问题:
levels(bes$education)
内容的提问来源于stack exchange,提问作者Kuddiking
相关产品推荐
相关产品推荐

