[英]Order descending based on a maximum value of a group, and then remove the maximum column in dplyr
假設,在iris
數據集中,我想要:
Sepal.Length
的列按Species
排序,按降序排列。Sepal.Length
列。Species
中,保持上述第一步的順序,按降序排列Sepal.Length
。以下代碼產生所需的 output:
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()
但是,假設我想將其寫為 function:
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
集成。
這是糾正它的一種方法 - 即轉換為string
並將該字符串用於任何需要的地方
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.