Zacznę od drugiego pytania, które jest łatwiejsze. Korzystanie z dplyr
pakiet, możesz użyć top_n
aby uzyskać n największych wierszy dla danej kolumny. Na przykład:
> top_n(p_ash_r_100a, 3, SMPL_CNT) %>% arrange(desc(SMPL_CNT))
# A tibble: 3 × 5
SMPL_TIME SQL_ID MODULE EVENT SMPL_CNT
<dttm> <chr> <chr> <chr> <int>
1 2017-04-11 09:01:00 NO_SQL GoldenGate CPU 7
2 2017-04-11 09:00:00 dgzp3at57cagd GoldenGate db file sequential read 2
3 2017-04-11 09:01:00 37cspa0acgqxp GoldenGate db file sequential read 2
Pamiętaj, że otrzymasz więcej niż n rzędów, jeśli będzie remis na n-tym miejscu. Zatem top_n(p_ash_r_100, 10, SMPL_CNT)
zwróci cały przykładowy zestaw danych ze względu na 17-kierunkowy remis dla 4. miejsca.
Jeśli chodzi o pierwsze pytanie, dokumentacja dla geom_area
daje wskazówkę:
Sugeruje to, że geom_area
oczekuje, że kolumna zamapowana na x powinna być liczbowa. Na podstawie wpisu dla p_ash_r_100
, SMPL_TIME
wydaje się być wektorem znaków. Za pomocą lubridate
pakiet, możemy przekonwertować SMPL_TIME
do daty i godziny z dmy_hm
:
p_ash_r_100a <- p_ash_r_100 %>%
mutate_at(vars(SMPL_TIME), dmy_hm)
Jednak to nie wystarczy, aby uzyskać pożądany wykres, ponieważ istnieje wiele wartości y
dla każdej kombinacji x
i fill
(co jest poprawną estetyką dla geom_area
, a nie „col
"). Musimy podsumować dane przed wykreśleniem:
p_ash_r_100a %>%
group_by(SMPL_TIME, EVENT) %>%
summarise(total = sum(SMPL_CNT)) %>%
ggplot(aes(SMPL_TIME, total, fill = EVENT)) +
geom_area()
Jednak fabuła nadal nie jest poprawna. Dzieje się tak, ponieważ każda kombinacja SMPL_TIME
i EVENT
nie jest reprezentowana w zestawie danych. Musimy wyraźnie powiedzieć geom_area
że y
jest równa zero dla tych brakujących wierszy. Jednym ze sposobów jest użycie poręcznego fill
argument w tidyr::spread
.
group_by(p_ash_r_100a, SMPL_TIME, EVENT) %>%
summarise(smpl_sum = sum(SMPL_CNT)) %>%
spread(EVENT, smpl_sum, fill = 0) %>%
gather(EVENT, smpl_sum, CPU, `db file sequential read`,
`direct path write`,
`Log archive I/O`) %>%
ggplot(aes(x = SMPL_TIME, y = smpl_sum, fill = EVENT)) +
geom_area()