r - 根据一组最大值降序排列,然后删除 dplyr 中的最大值列

标签 r dplyr

假设在 iris 数据集中,我想要:

  • 根据包含最大Sepal.Length 的列按物种排序,按降序排列。
  • 删除最大 Sepal.Length 列。
  • 在每个物种中,保持上述第一步的顺序,按降序排列Sepal.Length

以下代码产生所需的输出:

library(dplyr)

df <- iris %>%
  group_by(Species) %>%
  mutate(max.Sepal.length = max(Sepal.Length, na.rm = TRUE)) %>%
  as.data.frame() %>%
  arrange(desc(max.Sepal.length)) %>%
  select(-max.Sepal.length)

df[,"Species"] <- factor(df[,"Species"],
                         levels = unique(df[,"Species"]),
                         ordered = TRUE)

df <- df %>%
  arrange(Species, desc(Sepal.Length)) %>%
  as.data.frame()

但是,假设我想将其编写为函数:

df_order <- function(df, group_col, value_col) {
  df <- df %>%
    group_by({{ group_col }}) %>%
    mutate("max_{{value_col}}" := max({{value_col}}, na.rm = TRUE)) %>%
    as.data.frame() %>%
    arrange(desc("max_{{value_col}}")) %>%
    select(-"max_{{value_col}}")
  
  df[,"{{group_col}}"] <- factor(df[,"{{group_col}}"],
                           levels = unique(df[,"{{group_col}}"]),
                           ordered = TRUE)
  
  df <- df %>%
    arrange({{group_col}}, desc({{value_col}})) %>%
    as.data.frame()
  return(df)
}

df_order(iris, Species, Sepal.Length)

唉,这行不通。有人能指出我的代码哪里错了吗?我不太熟悉 dplyr 如何与 glue 集成。

最佳答案

这是纠正它的一种方法 - 即转换为字符串并在需要的地方使用该字符串

df_order <- function(df, group_col, value_col) {
   value_col_str <- rlang::as_string(rlang::ensym(value_col))
   group_col_str <- rlang::as_string(rlang::ensym(group_col))
   df <- df %>%
     group_by({{ group_col }}) %>%
     mutate("max_{{value_col}}" := max({{value_col}}, na.rm = TRUE)) %>%
     as.data.frame() %>%
     arrange(desc(!! rlang::sym(glue::glue("max_{value_col_str}")))) %>%
     select(-glue::glue("max_{value_col_str}"))
  
   df[,group_col_str] <- factor(df[,group_col_str],
                            levels = unique(df[,group_col_str]),
                            ordered = TRUE)
  
   df <- df %>%
     arrange({{group_col}}, desc({{value_col}})) %>%
     as.data.frame()
   return(df)
 }

-测试

out <- df_order(iris, Species, Sepal.Length)
 Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1            7.9         3.8          6.4         2.0  virginica
2            7.7         3.8          6.7         2.2  virginica
3            7.7         2.6          6.9         2.3  virginica
4            7.7         2.8          6.7         2.0  virginica
5            7.7         3.0          6.1         2.3  virginica
6            7.6         3.0          6.6         2.1  virginica
7            7.4         2.8          6.1         1.9  virginica
8            7.3         2.9          6.3         1.8  virginica
...

identical(out, df)
[1] TRUE

关于r - 根据一组最大值降序排列,然后删除 dplyr 中的最大值列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70187956/

相关文章:

删除 data.frame 中包含其他列的行

R dplyr - 动态排列行顺序

r - top_n 与 r 中的顺序

r - dplyr Pipes - 如何更改原始数据框

r - 更改网络图中的字体

r - 无法让 Cairo 在 CentOs 5.7 上进行 R 安装

r - 如何在R中的矩阵中找到互补行

r - 有没有办法像R中的capture.output()一样捕获Julia中的stdout?

r - knitr::include_graphics in bookdown,不渲染图像

r - 仅当同一列的组中存在另一个值时,dplyr 才对值进行过滤