按照特定顺序重新排序数据框中的行

时间:2017-03-02 18:35:55

标签: r sequence

如果Sequence为2,1,3,我想重新排序以下数据帧中的行。但是,这仅适用于项目ID相同的情况。因此,此逻辑应重新排序Project 123中的行,但不应影响项目124或125。

以下是数据:

Data <- data.frame(Project=c(123,123,123,124,125,125),
               Value=c(1,4,7,3,8,9),
               Sequence=c(2,1,3,2,1,3))

这是我正在寻找的结果:

Result <- data.frame(Project=c(123,123,123,124,125,125),
                 Value=c(4,1,7,3,8,9),
                 Sequence=c(1,2,3,2,1,3))

1 个答案:

答案 0 :(得分:0)

不是一件非常聪明的工作,但它应该有效 - 试试这个...
如果它出现在项目中,则此函数对指定序列的数据行进行排序。
(您也可以更改序列)

reorder <- function(data, sequence=c(2,1,3)){
        seq_len <- length(sequence)
        for (i in 1:(dim(data)[1]-seq_len)){
                seq_check <- identical(sequence, data$Sequence[i:(i+seq_len-1)])
                if (seq_check) {
                        pro_check <- identical(rep(data$Project[i], seq_len), data$Project[i:(i+seq_len-1)]) #check if Project is the same over the sequence
                        if (pro_check){
                                exchange <- data[i:(i+seq_len-1),]
                                for (j in 1:seq_len){
                                        data[(i+j-1),] <- exchange[exchange$Sequence==j,]
                                }
                        }
                }
        }
        data
}

运行:

Data_reordered <- reorder(Data)

结果:

> Data_reordered
  Project Value Sequence
1     123     4        1
2     123     1        2
3     123     7        3
4     124     3        2
5     125     8        1
6     125     9        3

> identical(Result, Data_reordered)
[1] TRUE

我希望这是您要求的解决方案: - )