我正在尝试根据组内同一数据框中另一列的唯一值,以降序或升序对数据框中的列重新排序。

为了演示这一点,下面给出了一个示例,其中数据框具有三列。目标是按 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_bydplyr::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/

10-12 17:09