我有一个数据框,每行都有一个值,每行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。
任何建议都将不胜感激!
答案 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