如果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))
答案 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
我希望这是您要求的解决方案: - )