我正在尝试根据组内同一数据框中另一列的唯一值,以降序或升序对数据框中的列重新排序。
为了演示这一点,下面给出了一个示例,其中数据框具有三列。目标是按 gr
列分组,并根据 a
列的唯一值对 b
列进行排序。因此,例如,如果在 gr=1
中,b
列的唯一值是 T,那么我希望 a
列按升序排列,如果不是按降序排列。示例如下
# sample dataset
df <- data.frame(
a = c(1,3,2,4),
b = c(T,T,F,F),
gr = c(1,1,2,2)
)
# split dataset according to a grouping column
df <- df %>% split(df$gr)
# ordering function
f1 <- function(dt) {
if (unique(dt$b) == T) {
arrange(dt, a)
} else {
arrange(dt, -a)
}
}
所需的数据集应如下所示:
# order within groups based on variable b
df %>% purrr::map_df(f1)
这可以在不使用列表或
tidyr::nest
的情况下完成吗?使用简单的 dplyr::group_by
和 dplyr::arrange
应该是可能的,并且是最好的答案。 最佳答案
这是单独使用 arrange
而不执行任何 split
的一种选择
library(dplyr)
df %>%
arrange(gr, c(1, -1)[gr] * a)
# a b gr
#1 1 TRUE 1
#2 3 TRUE 1
#3 4 FALSE 2
#4 2 FALSE 2
或者如果它需要与'b'
df %>%
arrange(gr, c(-1, 1)[(b + 1)] * a)
# a b gr
#1 1 TRUE 1
#2 3 TRUE 1
#3 4 FALSE 2
#4 2 FALSE 2
在这里,我们使用
numeric
'gr'。如果不是 numeric
,则使用 match
创建分组索引并使用它来更改 'a' 的值df %>%
arrange(gr, c(1, -1)[match(gr, unique(gr))] * a)
关于r - 根据组内另一列中的唯一值排列列中的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58329115/