将数据框中的列重新排序为指定的顺序

时间:2015-02-11 06:36:19

标签: r dataframe

我有一个数据框,每行都有一个值,每行100行都有一个索引(1到10之间)。我想按特定顺序对索引块进行排序,但我不确定如何执行此操作:

N=1000
value = runif(N, min=0, max=100)
index = rep(1:10, each=100)
DF=data.frame(value,index)
ord = c(1,4,6,3,7,9,8,2,5,10)

所以基本上,我希望DF的索引列以ord中指定的顺序排序,而不是DF的索引列被排序为1,2,3,4,5,6,7, 8,9,10。

任何建议都将不胜感激!

3 个答案:

答案 0 :(得分:4)

您只需将index转换为系数,然后按ord顺序设置级别,然后按

中的顺序对数据进行排序
DF$index <- factor(DF$index, levels = ord)
DF[order(DF$index), ]

如果您不想“更改原始数据”,您只需创建一个单独的索引,如

indx <- factor(DF$index, levels = ord) 
DF[order(indx), ]

其他otion是使用setorder包中的data.table按参考订购您的数据集

library(data.table)
setorder(setDT(DF)[, index := factor(index, levels = ord)], index)

答案 1 :(得分:2)

以下是我的建议:

#Genreate the data    
N<-1000
value <- runif(N, min=0, max=100)
index <- rep(1:10, each=100)
DF<-data.frame(value,index)
ord <- c(1,4,6,3,7,9,8,2,5,10)

#Create a list with the data sorted by the provided order
newDF<-apply(matrix(ord,,ncol=1),1,function(x) DF[DF[,2]==x,])

#Unlist the list into a dataframe
do.call(rbind.data.frame,newDF)

答案 2 :(得分:1)

在不更改原始数据的情况下,您可以merge使用sort=FALSE

merge(data.frame(index=ord), DF, by="index", sort=FALSE)

#   ord    value
#1    1 37.29915
#2    1 30.09436
#3    4 18.05961
#4    4 46.73024
#5    6 93.15545
#6    6 69.33484
#7    3 70.92353
#8    3 81.63010
#9    7 22.23649
#10   7 32.36390
# etc etc