Я считаю это идеальный случай использования factor
и тщательно установки levels
. Я буду использовать data.table
здесь с этой идеей. Убедитесь, что ваш столбец value
равен character
(не является абсолютным требованием).
шаг 1: Получите ваш data.frame
преобразованы в data.table
, принимая только unique
строки.
require(data.table)
dt <- as.data.table(unique(df))
setkey(dt, "depth") # just to be sure before factoring "value"
шаг 2: Преобразование value
к factor
и принуждают к numeric
. Удостоверьтесь, что установил уровни самостоятельно (это важно).
dt[, id := as.numeric(factor(value, levels = unique(value)))]
шаг 3: Установите ключевой столбец depth
для подмножеств и просто выбрать последнее значение
setkey(dt, "depth", "id")
dt.out <- dt[J(unique(depth)), mult="last"][, value := NULL]
# depth id
# 1: 1 2
# 2: 2 2
# 3: 3 3
Шаг 4: Так как все значения в строках с увеличением глубины должны иметь на наименьшее значение значение предыдущей строки, вы должны использовать cummax
, чтобы получить окончательный вывод.
dt.out[, id := cummax(id)]
Edit: Приведенный выше код был в иллюстративных целях. На самом деле вам вообще не нужна третья колонка. Вот как я напишу окончательный код.
require(data.table)
dt <- as.data.table(unique(df))
setkey(dt, "depth")
dt[, value := as.numeric(factor(value, levels = unique(value)))]
setkey(dt, "depth", "value")
dt.out <- dt[J(unique(depth)), mult="last"]
dt.out[, value := cummax(value)]
Вот более сложным примером и выход из кода:
df <- structure(list(depth = c(1, 1, 2, 2, 3, 3, 3, 4, 5, 5, 6),
value = structure(c(1L, 2L, 3L, 4L, 1L, 3L, 4L, 5L, 6L, 1L, 1L),
.Label = c("a", "b", "c", "d", "f", "g"), class = "factor")),
.Names = c("depth", "value"), row.names = c(NA, -11L),
class = "data.frame")
# depth value
# 1: 1 2
# 2: 2 4
# 3: 3 4
# 4: 4 5
# 5: 5 6
# 6: 6 6
Вот 'dplyr' версия:' DF%>% устраивают (глубина)%>% мутировать (значение = cummax (as.numeric (фактор (значение, уровни = уникальный (значение)))))%>% arr (глубина, desc (значение))%>% различная (глубина) '. –
Этот метод обычно применяется, когда значения 'depth' и' value' являются строковыми значениями. Благодаря! – ecoe
@Arun Это отличное решение! Благодаря! – asterx