r - 根据组内另一列中的唯一值排列列中的值

标签 r dataframe dplyr

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

为了演示这一点,下面给出了一个示例,其中数据框具有三列。目标是按 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 '克'。如果不是numeric , 使用 match 创建分组索引并用它来改变 'a' 的值
df %>%
   arrange(gr, c(1, -1)[match(gr, unique(gr))] * a)

关于r - 根据组内另一列中的唯一值排列列中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58329115/

相关文章:

r - 根据某个变量将许多列变为 NA

html - 将 html 表提取到 R 中,但在多页 html 中跳过具有三行/行的特定列中的特定元素(<br>)

r - 使用R : How do I create a time-series object with dates?

R & ggplot2 : How to get arrows under the axis label?

r - 有条件地从数据框中删除

r - 在 r 中使用多个条件将控件与案例匹配

python - Pandas str.contains,包含所有给定的字符

Python:我有具有相同列名的 Pandas 数据框。如何改变其中之一?

r - 使用 dplyr 基于 R 中的其他两列自定义变异新列

r - 在 r 中查看 PostgreSQL 数据库中所有模式的列表?