Uważam to idealny przypadek użycia factor
i ustawienie levels
ostrożnie. Użyję tutaj data.table
z tym pomysłem. Upewnij się, że Twoja kolumna value
to character
(nie jest to wymaganie bezwzględne).
krok 1: Get data.frame
konwertowane do data.table
biorąc zaledwie unique
wiersze.
require(data.table)
dt <- as.data.table(unique(df))
setkey(dt, "depth") # just to be sure before factoring "value"
krok 2: Konwersja value
do factor
i zmuszania do numeric
. Upewnij się, że ustaw sobie poziom (jest to ważne).
dt[, id := as.numeric(factor(value, levels = unique(value)))]
krok 3: Ustaw kolumnę klucza do depth
dla podzbioru i prostu odebrać ostatnią wartość
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
Krok 4: Ponieważ wszystkie wartości w wierszach ze wzrostem głębokości powinien mieć na najmniej wartość poprzedniego rzędu, powinieneś użyć cummax
, aby uzyskać ostateczne wyjście.
dt.out[, id := cummax(id)]
Edit: Powyższy kod był dla celów poglądowych. W rzeczywistości wcale nie potrzebujesz trzeciej kolumny. Tak właśnie napisałbym ostatni kod.
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)]
Oto bardziej skomplikowany przykład i wyjście z kodu:
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
Oto wersja dplyr' ':' df%>% zorganizować (głębokość)%>% mutować (wartość = cummax (as.numeric (factor (wartość, wyjątkowy poziom = (value)))))%>% aranżacja (depth, desc (value))%>% distinct (depth) '. –
Ta metoda może być ogólnie stosowana, gdy zarówno 'depth' jak i' value' są wartościami łańcuchowymi. Dzięki! – ecoe
@Arun To świetne rozwiązanie! Dzięki! – asterx