解决fct_reorder结合lookup data.frame重排因子时行数不匹配报错问题
问题原因
fct_reorder()要求第二个参数的长度必须和第一个参数(这里是sales_rep)完全一致,但df_ranking$pct_change仅包含3个销售代表的增长率值,而df$sales_rep对应9行数据,长度不匹配导致报错。
解决方法
方法1:合并数据后排序
先通过left_join将增长率数据关联到原数据集,确保每一行都有对应的增长率值,再用fct_reorder()完成排序:
df %>% left_join(df_ranking %>% select(sales_rep, pct_change), by = "sales_rep") %>% mutate(sales_rep = fct_reorder(sales_rep, pct_change))
方法2:用match匹配对应增长率
无需合并数据,直接通过match()函数将每个sales_rep对应的增长率匹配到原数据集的每一行:
df %>% mutate( sales_rep = fct_reorder(sales_rep, df_ranking$pct_change[match(sales_rep, df_ranking$sales_rep)]) )
方法3:直接指定因子水平顺序
先从df_ranking中提取按增长率排序后的sales_rep顺序,再用fct_relevel()重设因子水平(这种方式更直观):
# 获取按增长率升序排列的销售代表顺序(降序则用arrange(desc(pct_change))) new_level_order <- df_ranking %>% arrange(pct_change) %>% pull(sales_rep) # 重设因子水平 df %>% mutate(sales_rep = fct_relevel(sales_rep, new_level_order))
验证效果
以方法1为例,查看重排后的因子水平:
df_updated <- df %>% left_join(df_ranking %>% select(sales_rep, pct_change), by = "sales_rep") %>% mutate(sales_rep = fct_reorder(sales_rep, pct_change)) levels(df_updated$sales_rep) # 输出会按pct_change升序排列,对应结果为:[1] "1" "2" "3"
内容的提问来源于stack exchange,提问作者joshbrows
相关产品推荐
相关产品推荐

