使用forcats::fct_relevel出现'unknown levels'错误的原因
问题:fct_relevel报错"未知级别"的原因及解决方法
问题描述
尝试用forcats::fct_relevel将数据框cheeses中mymonth列的数值替换为cheesemonth中的月份缩写,运行代码时出现错误:'6 unknown levels in f: Jan, Feb, Mar, Apr, May, and Jun'。使用case_match能实现替换,但无法复用cheesemonth列表,想知道错误原因。
相关代码:
cheeses<-tribble( ~mymonth, ~Brie, ~Stilton, 1, 4, 2, 2, 4, 1, 3, 1, 3, 4, 1, 5, 5, 2, 4, 6, 3, 1 ) cheesemonth<-c("Jan", "Feb", "Mar", "Apr", "May", "Jun")
报错代码:
cheeses %>% mutate(mymonth=factor(mymonth)) %>% mutate(mymonth=fct_relevel(mymonth, cheesemonth))
错误原因
fct_relevel的核心功能是调整已有因子级别的顺序,它要求传入的所有级别必须是当前因子已经存在的级别。
你的代码中:
- 将
mymonth转为因子后,它的级别是"1", "2", "3", "4", "5", "6"(对应原始数值的字符形式); - 你传给
fct_relevel的是cheesemonth里的月份缩写,这些并不是当前因子的级别,所以R会报错提示找不到这些未知级别; - 你实际需要的是替换因子的级别标签,而非调整顺序,因此用错了函数。
正确实现方法(复用cheesemonth列表)
方法1:转因子时直接指定标签
在将数值列转为因子的同时,通过levels和labels参数直接关联原始数值和月份缩写,完美复用cheesemonth:
cheeses %>% mutate(mymonth = factor(mymonth, levels = 1:6, labels = cheesemonth))
方法2:用fct_recode配合命名向量
如果已经是因子列,可使用fct_recode,通过命名向量批量替换标签,同样复用cheesemonth:
cheeses %>% mutate(mymonth = factor(mymonth)) %>% mutate(mymonth = fct_recode(mymonth, !!!set_names(cheesemonth, as.character(1:6))))
这里set_names(cheesemonth, as.character(1:6))生成了Jan="1", Feb="2"...的命名向量,!!!用于将向量拆解为fct_recode所需的参数格式。
内容的提问来源于stack exchange,提问作者donnek
相关产品推荐
相关产品推荐

