我有以下data.frame个.

library(tidyverse)

df <- 
  tibble::tribble(
    ~year, ~sales_rep, ~sale_count,
    2021,        "1",         615,
    2021,        "2",         246,
    2021,        "3",         245,
    2022,        "1",         736,
    2022,        "2",          56,
    2022,        "3",         868,
    2023,        "1",         452,
    2023,        "2",         185,
    2023,        "3",         915
  )

# convert sales_rep into a factor
df <-
  df %>% 
  mutate(
    across(
      sales_rep,
      as_factor
    )
  )

# look at levels
levels(df$sales_rep)
#> [1] "1" "2" "3"

我想使用下面的data.frame重新订购sales_rep的水平,销售额比平均水平增长10%.但是,df_ranking的行数比df少,因此fct_reorder()会抛出错误.我怎么才能绕过这个问题呢?

# calculate percent change between 2023 and all previous years in sales by rep
df_ranking <-
  df %>% 
    mutate(
      year_grouping = 
        case_when(
          year == 2023 ~ 'sales_2023',
          year < 2023 ~ 'sales_previous'
        )
    ) %>% 
    summarize(
      mean_sale_count = mean(sale_count),
      .by = c(year_grouping, sales_rep)
    ) %>% 
    pivot_wider(
      names_from = year_grouping,
      values_from = mean_sale_count
    ) %>% 
    mutate(
      pct_change = (sales_2023 - sales_previous)/sales_previous
    )

# this doesn't work
df %>% 
  mutate(
    sales_rep = fct_reorder(sales_rep, df_ranking$pct_change)
  )
#> Error in `mutate()`:
#> i In argument: `sales_rep = fct_reorder(sales_rep,
#>   df_ranking$pct_change)`.
#> Caused by error in `fct_reorder()`:
#> ! length(f) == length(.x) is not TRUE
#> Backtrace:
#>      x
#>   1. +-df %>% ...
#>   2. +-dplyr::mutate(., sales_rep = fct_reorder(sales_rep, df_ranking$pct_change))
#>   3. +-dplyr:::mutate.data.frame(., sales_rep = fct_reorder(sales_rep, df_ranking$pct_change))
#>   4. | \-dplyr:::mutate_cols(.data, dplyr_quosures(...), by)
#>   5. |   +-base::withCallingHandlers(...)
#>   6. |   \-dplyr:::mutate_col(dots[[i]], data, mask, new_columns)
#>   7. |     \-mask$eval_all_mutate(quo)
#>   8. |       \-dplyr (local) eval()
#>   9. +-forcats::fct_reorder(sales_rep, df_ranking$pct_change)
#>  10. | \-base::stopifnot(length(f) == length(.x))
#>  11. |   \-base::stop(simpleError(msg, call = if (p <- sys.parent(1L)) sys.call(p)))
#>  12. \-dplyr (local) `<fn>`(`<smplErrr>`)
#>  13.   \-rlang::abort(message, class = error_class, parent = parent, call = error_call)

创建于2024-01-15年第reprex v2.0.2

推荐答案

你可以用factor()而不是forcats::fct_reorder() 以所需的顺序提供levels参数.

首先你要dplyr::arrange() df_ranking,以确保sales_rep 是按所需顺序排列的.然后我们用dplyr::pull()来提取sales_rep.

pct_change_order <-
  df_ranking |>
  arrange(-pct_change) |>
  pull(sales_rep)

现在,我们可以应用所需的因子顺序:

res <- 
  df %>%
  mutate(sales_rep = factor(sales_rep, pct_change_order))

levels(res$sales_rep)
#> [1] "3" "2" "1"

R相关问答推荐

卸载安装了BRM的模型发出的警告

查找具有平局的多个列的最大值并返回列名或平局 destruct 者NA值

如何直接从R中的风险分数计算c指数?

错误:非常长的R行中出现意外符号

将包含卷的底部25%的组拆分为2行

如何在ggplot图中找到第二轴的比例

R中边际效应包中Logistic回归的交互作用风险比

当我们有多个反斜杠和/特殊字符时使用Gsubing

R-按最接近午夜的时间进行筛选

Geom_Hline将不会出现,而它以前出现了

从R中的对数正态分布生成随机数的正确方法

为左表中的所有行使用值Fill滚动左连接

在列表中排列R数据框中的列顺序

R+reprex:在呈现R标记文件时创建可重现的示例

按两个因素将观测值分组后计算单独的百分比

有没有办法将勾选/审查标记添加到R中的累积关联图中?

使用列名和r中的前缀 Select 列的CREATE函数

图中显示错误 colored颜色 的图例geom_sf

如何准确地指出Read_delim所面临的问题?

将`magick`对象转换为原始向量