根据序列重新排序行

时间:2017-03-16 17:42:57

标签: r sequence

通过以下数据,我想重新排列每个唯一ProjectID中的行。

Data <- data.frame(ProjectID=c(123,123,123,124,125,125,126,126,126,126,128,129),
               Value=c(1,4,7,3,8,9,2,5,3,7,2,6),
               Sequence=c(1,3,2,1,3,2,1,1,4,2,2,4))

在每个唯一的ProjectID中,如果序列包含&#34; 1,3,2&#34;或&#34; 1,4,2&#34;我想重新排序行以遵循&#34; 3,1,2&#34;或者&#34; 4,1,2和#34;分别。

在ProjectID 126中,序列1,1,4,2有四个观测值,因此预期结果应显示为1,4,1,2。

我怎样才能做到这一点?

结果应如下

Result <- data.frame(ProjectID=c(123,123,123,124,125,125,126,126,126,126,128,129),
                 Value=c(4,1,7,3,8,9,2,3,5,7,2,6),
                 Sequence=c(3,1,2,1,3,2,1,4,1,2,2,4))

1 个答案:

答案 0 :(得分:1)

do.call(rbind,
    lapply(split(Data, Data$ProjectID), function(a){
        if(identical(a$Sequence, c(1,4,2))){
            a[match(a$Sequence, c(4,1,2)),]
        }else if(identical(a$Sequence, c(1,3,2))){
            a[match(a$Sequence, c(3,1,2)),]
        }else{
            a
        }
    }
)
)
#      ProjectID Value Sequence
#123.2       123     4        3
#123.1       123     1        1
#123.3       123     7        2
#124         124     3        1
#125.5       125     8        3
#125.6       125     9        2
#126.8       126     5        4
#126.7       126     2        1
#126.9       126     7        2
#128         128     2        2
#129         129     6        4