如何对数据框中的多个升序/降序列进行排序。R

如何对数据框中的多个升序/降序列进行排序。R,r,sorting,dataframe,matrix,gradient,R,Sorting,Dataframe,Matrix,Gradient,我对R相当陌生,也许不知道处理这项任务的最佳方法,但我尝试了一些不同的建议,没有一个建议允许我在data.frame中对多个列进行排序 主要用于: df = data.frame(matrix(c(-1,3,6,1,3,-5,2,4,9,-3,-1,-6,1,4,5), ncol=3) X1 X2 X3 [1] -1 -5 -1 [2] 3 2 -6 [3] 6 4 1 [4] 1 9 4 [5] 3 -3 5 我

我对R相当陌生,也许不知道处理这项任务的最佳方法,但我尝试了一些不同的建议,没有一个建议允许我在data.frame中对多个列进行排序

主要用于:

df = data.frame(matrix(c(-1,3,6,1,3,-5,2,4,9,-3,-1,-6,1,4,5), ncol=3)

       X1 X2 X3
   [1] -1 -5 -1
   [2]  3  2 -6
   [3]  6  4  1
   [4]  1  9  4
   [5]  3 -3  5       
我想对所有的列进行独立排序,这样我就可以让所有的列按“降序”排序,让一半的列按“升序”排序,另一半按“降序”排序,等等

这样做的目的是创建用于热图的柱状梯度。2同时还能够控制柱的平均值、方差等。例如,我的data.frame最有可能是:

df <- data.frame(matrix(runif(5200,0,1), ncol=10))

df如何
sapply

n   <- ncol(df)
as  <- 3 # columns to be sorted ascending
de  <- 2 # columns to be sorted descending
out <- sapply(1:n, function(x) {
  if(x %in% as) {
    return(sort(df[,x], decreasing = F))
  } else if (x %in% de) {
    return(sort(df[,x], decreasing = T))
  }
  return(df[,x])
})
out


    [,1] [,2] [,3]
[1,]   -1   -5   -1
[2,]    3   -3   -6
[3,]    6    2    1
[4,]    1    4    4
[5,]    3    9    5

n您也可以使用
mutate\u在
+
排序
:

library(dplyr)

df %>%
  mutate_at(1:2, funs(sort(.))) %>%
  mutate_at(3, funs(sort(., decreasing = TRUE)))
结果:

  X1 X2 X3
1 -1 -5  5
2  1 -3  4
3  3  2  1
4  3  4 -1
5  6  9 -6
您还可以将其变成一个方便的功能:

library(rlang)

arrange_indep = function(DF, asc = 1:ncol(DF), dsc=0){
  asc_quo = enquo(asc)
  dsc_quo = enquo(dsc)

  temp = DF %>%
    mutate_at(vars(!!asc_quo), funs(sort(.))) 

  if(dsc_quo != quo(0)){
    temp = temp %>%
      mutate_at(vars(!!dsc_quo), funs(sort(., decreasing = TRUE)))
  }
  return(temp)  
}
结果和用法:

  X1 X2 X3
1 -1 -5  5
2  1 -3  4
3  3  2  1
4  3  4 -1
5  6  9 -6
1.)前两列上升,第三列下降:

df %>%
  arrange_indep(1:2, 3)

  X1 X2 X3
1 -1 -5  5
2  1 -3  4
3  3  2  1
4  3  4 -1
5  6  9 -6
2.)与1.)相同,但采用非标准评估:

df %>%
  arrange_indep(X1:X2, X3)

  X1 X2 X3
1 -1 -5  5
2  1 -3  4
3  3  2  1
4  3  4 -1
5  6  9 -6
3.)前两列上升,保持第三列未排序:

df %>%
  arrange_indep(1:2)

  X1 X2 X3
1 -1 -5 -1
2  1 -3 -6
3  3  2  1
4  3  4  4
5  6  9  5
4.)前两列下降,第三列默认为上升:

df %>%
  arrange_indep(dsc=1:2)

  X1 X2 X3
1  6  9 -6
2  3  4 -1
3  3  2  1
4  1 -3  4
5 -1 -5  5
5.)使用默认的按升序排列所有列:

df %>%
  arrange_indep()

  X1 X2 X3
1 -1 -5 -6
2  1 -3 -1
3  3  2  1
4  3  4  4
5  6  9  5

这是我100%想要的!非常感谢你!
df %>%
  arrange_indep()

  X1 X2 X3
1 -1 -5 -6
2  1 -3 -1
3  3  2  1
4  3  4  4
5  6  9  5