如何对数据框中的多个升序/降序列进行排序。R
我对R相当陌生,也许不知道处理这项任务的最佳方法,但我尝试了一些不同的建议,没有一个建议允许我在data.frame中对多个列进行排序 主要用于:如何对数据框中的多个升序/降序列进行排序。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 我
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