2017-03-16 134 views
0

使用以下數據我想重新排列每個唯一的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

回答

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

感謝您的幫助。有你的代碼的理論。如果對於每個項目ID,該序列不是該ProjectID中唯一的行。例如,如果ProjectID 126有4行,序列1,1,4,2而不是3行,那該怎麼辦?數據< - 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,5,7,2,6), Sequence = c(1 ,3,2,1,3,2,1,1,4,2,2,4)) – Dfeld