У меня есть фрейм данных, в котором некоторые строки должны быть переупорядочены. Например, возьмите:
df <- data.frame(name = c(1,1,1,1,1,2,2,2,2,2),
id = c("s","s","s","i","s","s","i","s","s","s"),
var1 = c(3,5,6,4,-7,2,1,-1,3,-6),
var2 = c(2,6,-7,5,-9,7,3,2,4,-9))
В этом кадре данных строки, в которых id == "i"
должны быть переупорядочены. Изменение порядка должно выполняться путем сравнения значений в других строках группы (в этом случае столбец name
можно использовать для group_by
). Условием для переупорядочения является, например, следующее. если текущая строка для проверки является строкой, в которой id == "i"
, тогда проверьте:
var1 < lead(var1) & var1 > lag(var1) & var2 < lead(var2) & var2 > lag(var2)
Если FALSE, то это означает, что этот ряд следует перемещать до тех пор, пока это условие не станет TRUE.
После переупорядочения конечный продукт должен быть:
df_output <- data.frame(name = c(1,1,1,1,1,2,2,2,2,2),
id = c("s","i","s","s","s","s","s","i","s","s"),
var1 = c(3,4,5,6,-7,2,-1,1,3,-6),
var2 = c(2,5,6,-7,-9,7,2,3,4,-9))
Обратите внимание, что в первой группе строка, в которой id == "i"
переместилась с 4-й позиции на 2-ю позицию, а во второй группе - с 2-й на 3-ю позицию.
Можно ли это сделать с помощью tidyverse
, если это возможно (если не с любым, который работает)?