R使用mapvalues重命名因子水平出现invalid 'times'错误如何解决?
报错含义解释
你遇到的Error in rep.int(names(value), lapply(value, length))是plyr包mapvalues函数的内部错误,触发原因是你传入的from和to参数格式不符合要求:你用cig_brand[1]取到的是单列数据框,转成list后是仅含1个元素的嵌套结构(元素内才是所有旧值的向量),不是和水平数等长的一维向量,函数匹配取值时拿到了无效的长度参数,因此抛出报错。
附带的取值不存在警告,是因为你读取的csv对照文件混入了多余的非数值内容(比如文件备注、生成时间、表头说明等,从警告里的TOBACCO、Codebook Creation Date: 10/9/2020就能看出来),这些无效值本来就不存在于你的数据列中。
修复方案
按照以下步骤修改代码即可解决问题:
- 取对照列时用双括号
[[提取向量,不要用单括号[取子数据框,也不需要转成list - 先清理对照文件里的无效行,过滤掉非数值的旧值
- 注意变量名统一,你代码里前面创建的是
NSDUH_cig30,后续赋值时误用了不存在的NSDUH_cig30_sub
修正后的示例代码:
# 加载依赖包 library(dplyr) library(forcats) # 读取原始数据,仅转换目标列为因子 NSDUH <- PUF2019_100920 NSDUH_cig30 <- subset(NSDUH_1_cigever, select = c("cig30br2", "cigever")) %>% mutate(cig30br2 = as.factor(cig30br2)) # 读取对照文件,清理无效值 cig_brand <- read.csv("cig_brands.csv") # 仅保留旧值为纯数字的有效对照行 valid_mask <- grepl("^\\d+$", cig_brand[[1]]) old_val <- cig_brand[[1]][valid_mask] new_val <- cig_brand[[2]][valid_mask] # 重命名因子水平(用forcats更适配因子类型,比mapvalues稳定性更高) NSDUH_cig30$cig30br2 <- fct_recode(NSDUH_cig30$cig30br2, !!!setNames(new_val, old_val))
如果要继续使用mapvalues,替换最后一步代码即可:
library(plyr) NSDUH_cig30$cig30br2 <- mapvalues(NSDUH_cig30$cig30br2, from = old_val, to = new_val)
内容的提问来源于stack exchange,提问作者ar2325
相关产品推荐
相关产品推荐

