r - 根据多列排列长格式数据框并考虑改变排序方向

标签 r sorting dplyr tidyverse

我想根据得分变量 value 和附加的 group 变量重新排列我的数据。但是,根据 group,排序应该是降序或升序。这些组由测试分数(越高越好)和处理时间(越低越好)组成。

df <- data.frame(id = rep(1:4, 4),
                 value = rnorm(16, 5), 
                 group = c(paste0("test", 1:3), "time0"))
df$value[seq(4,16, 4)] <- 1:4

> df %>% group_by(group) %>% arrange(group, desc(value))
# A tibble: 16 x 3
# Groups:   group [4]
      id value group
   <int> <dbl> <fct>
 1     3  6.06 test1
 2     4  4.69 test1
 3     1  4.32 test1
 4     2  3.56 test1
 5     4  5.96 test2
 6     1  5.96 test2
 7     3  4.43 test2
 8     2  3.86 test2
 9     3  6.28 test3
10     4  5.55 test3
11     2  4.59 test3
12     1  3.53 test3
13     4  4    time0
14     3  3    time0
15     2  2    time0
16     1  1    time0

所需的输出如下所示:

      id value group
   <int> <dbl> <fct>
 1     3  6.06 test1
 2     4  4.69 test1
 3     1  4.32 test1
 4     2  3.56 test1
 5     4  5.96 test2
 6     1  5.96 test2
 7     3  4.43 test2
 8     2  3.86 test2
 9     3  6.28 test3
10     4  5.55 test3
11     2  4.59 test3
12     1  3.53 test3
13     4  1    time0
14     3  2    time0
15     2  3    time0
16     1  4    time0

我尝试使用 arrange_if 但无法弄清楚。 任何帮助深表感谢。

感谢到目前为止的回答,它们同样有帮助!


编辑澄清:这不同于this问题,因为排序不仅基于多列,还取决于列内特征。

最佳答案

这使得测试组​​中的行降序排列,时间组中的行升序排列。如果要取反,只需将 -1 和 1 取反即可。

df %>% 
  arrange(group, value*ifelse(grepl('time', group), 1, -1))

#    id    value group
# 1   1 6.358680 test1
# 2   1 6.100025 test1
# 3   1 4.844204 test1
# 4   1 3.622940 test1
# 5   2 5.763176 test2
# 6   2 4.897212 test2
# 7   2 4.585005 test2
# 8   2 3.529248 test2
# 9   3 5.387672 test3
# 10  3 4.835476 test3
# 11  3 4.605710 test3
# 12  3 4.521850 test3
# 13  4 1.000000 time0
# 14  4 2.000000 time0
# 15  4 3.000000 time0
# 16  4 4.000000 time0

这是另一个选项,当 value 是字符时有效

df <- data.frame(id = rep(1:4, 4),
                 value = rnorm(16, 5), 
                 group = c(paste0("test", 1:3), "time0"))
set.seed(2019)
df$value <- sample(letters, nrow(df), T)

df %>% 
  arrange(group, rank(value)*ifelse(grepl('time', group), 1, -1))
#    id value group
# 1   1     u test1
# 2   1     f test1
# 3   1     c test1
# 4   1     b test1
# 5   2     s test2
# 6   2     p test2
# 7   2     f test2
# 8   2     b test2
# 9   3     v test3
# 10  3     u test3
# 11  3     s test3
# 12  3     h test3
# 13  4     a time0
# 14  4     q time0
# 15  4     q time0
# 16  4     r time0

关于r - 根据多列排列长格式数据框并考虑改变排序方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57807574/

相关文章:

r - 计算数据帧子集中数字的出现

r - 如何根据 R 中引用其他列的一列的值创建多个计算列?

R:如何从RDS文件中读取选定的列?

r - 如何添加 ggplot2 网格线或颜色以按变量(y 轴)显示多个绘图点?

r - 如何为圆形图添加外部轨道

c++ - 使用 Cuda 的排序算法。内仁还是外仁?

java - 用对象对列表进行排序?

java - 如何按某种自然顺序对链表进行排序?

r - 为什么 left_join 产生 NA 值

r - 在 dplyr 中选择的奇怪行为