обновленный ответ
В этом обновлении также учитываются убывающие этапы
пример данных
library(data.table)
DT <- fread("Var1 | V1 | V2
0060a00000fUbAnAAK |S 2 |S 5
0060a00000fUbAnAAK_ |S 5 |S 3")
# Var1 V1 V2
# 1: 0060a00000fUbAnAAK S 2 S 5
# 2: 0060a00000fUbAnAAK_ S 5 S 3
код
#determine order of stages
DT[ as.numeric( gsub("[^0-9]", "", V2 ) ) < as.numeric( gsub("[^0-9]", "", V1 ) ), order := "desc" ]
DT[ is.na( order) , order := "asc" ]
#melt DT to long format
DT <- melt( DT, id.vars = c("Var1","order"), value.name = "stage")
#get stage as numeric and clean up unwanted columns
DT[, `:=`(stage = as.numeric( gsub("[^0-9]", "", stage)))]
#create new stages based on minimum and maximum stage per Var1-value
#use different methodes of ascending and descneding stages, then bind the rows together
rbind(
DT[order == "asc", .( V1 = paste0( "S ", min(stage): (max(stage) - 1 ) ),
V2 = paste0( "S ", (min(stage)+1):max(stage) ) ), by = .(Var1)],
DT[order == "desc", .( V1 = paste0( "S ", max(stage): (min(stage) + 1 ) ),
V2 = paste0( "S ", (max(stage)-1):min(stage) ) ), by = .(Var1)]
)
вывод
# Var1 V1 V2
# 1: 0060a00000fUbAnAAK S 2 S 3
# 2: 0060a00000fUbAnAAK S 3 S 4
# 3: 0060a00000fUbAnAAK S 4 S 5
# 4: 0060a00000fUbAnAAK_ S 5 S 4
# 5: 0060a00000fUbAnAAK_ S 4 S 3
предыдущий ответ
`data.table` solution
**sample data**
library(data.table)
DT <- fread("Var1 | V1 | V2
0060a00000fUbAnAAK |S 2 |S 5")
**code**
#melt DT to long format
DT <- melt( DT, id.vars = "Var1", value.name = "stage")
#get stage as numeric and clean up unwanted columns
DT[, `:=`(variable = NULL, stage = as.numeric( gsub("[^0-9]", "", stage)))]
#create new stages based on minimum and maximum stage per Var1-value
DT[, .( V1 = paste0( "S ", min(stage):(max(stage)-1) ),
V2 = paste0( "S ", (min(stage)+1):max(stage) ) ), by = .(Var1)][]
**output**
# Var1 V1 V2
# 1: 0060a00000fUbAnAAK S 2 S 3
# 2: 0060a00000fUbAnAAK S 3 S 4
# 3: 0060a00000fUbAnAAK S 4 S 5