You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 14:39:03