基于序列对行重新排序

问题描述:

使用以下数据我想重新排列每个唯一的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)) 

在每一个独特的专案编号,如果序列中包含或者“1,3,2”或“1,4,2”我要重新排序的行遵循“3,1,2”或“4 ,1,2“。

在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)) 
+0

什么其他情况下,即2,3,1或2个,1个,3个或1,2,3等 – akrun

+0

@akrun我只感兴趣在这两种情况下(1,3,2和1,4,2)。 – Dfeld

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 
+0

感谢您的帮助。有你的代码的理论。如果对于每个项目ID,该序列不是该ProjectID中唯一的行。例如,如果ProjectID 126有4行,序列1,1,4,2而不是3行,那该怎么办?数据 Dfeld