Важным моментом здесь является определение того, какие строки принадлежат какой группе. Ответы Ronak и akrun оба используют rleid(Service_tier)
, предполагая, что изменение Service_tier
указывает на начало новой группы.
Это может быть предложено образцом набора данных, но не может считаться гарантированным. ИМХО, Service_tier
скорее атрибут, чем ключ. Фактически, OP проверяет наличие NN == EE
в своем фрагменте кода, чтобы переключиться на новую группу.
В приведенных ниже решениях для data.table группировка определяется с помощью cumsum(shift(NN == EE, fill = TRUE))
, который проверяет равенство fo NN
и EE
, переносит результат в следующую строку, где начинается следующая группа, и перечисляет группы путем подсчета TRUE
с использованием cumsum()
.
В упрощенном варианте (без изменения формы) прыжки агрегируются функцией toString()
:
library(data.table)
setDT(d)[, .(SN = first(SN), hops = toString(NN), Service_tier = first(Service_tier)),
by = .(grp = cumsum(shift(NN == EE, fill = TRUE)))][]
grp SN hops Service_tier
1: 1 A B, C economy
2: 2 P Q, S, R regular
3: 3 H I, J, K, L economy
Для преобразования из длинного в широкий формат используется dcast()
:
library(data.table)
library(magrittr) # piping used to improve readability
w <- setDT(d)[, .(SN = first(SN), hops = NN, Service_tier = first(Service_tier)),
by = .(grp = cumsum(shift(NN == EE, fill = TRUE)))] %>%
dcast(grp + ... ~ rowid(grp, prefix = "hop"), value.var = "hops", fill = "") %>%
setcolorder(c(1:2, 4:ncol(.), 3))
w
grp SN hop1 hop2 hop3 hop4 Service_tier
1: 1 A B C economy
2: 2 P Q S R regular
3: 3 H I J K L economy
setcolorder()
используется для перестановки столбцов в порядке, ожидаемом OP. Это делается на месте , т.е. без копирования всего объекта данных.
Данные
library(data.table)
d <- fread("SN NN EE Service_tier
A B C economy
B C C economy
P Q R regular
Q S R regular
S R R regular
H I L economy
I J L economy
J K L economy
K L L economy")