Ostatecznie próbuję osiągnąć coś podobnego do następującego, ale wykorzystując dplyr
zamiast plyr
:Co to jest odpowiednik dplyr plyr :: ldply (tapply) w R?
library(dplyr)
probs = seq(0, 1, 0.1)
plyr::ldply(tapply(mtcars$mpg,
mtcars$cyl,
function(x) { quantile(x, probs = probs) }))
# .id 0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
# 1 4 21.4 21.50 22.80 22.80 24.40 26.0 27.30 30.40 30.40 32.40 33.9
# 2 6 17.8 17.98 18.32 18.98 19.40 19.7 20.48 21.00 21.00 21.16 21.4
# 3 8 10.4 11.27 13.90 14.66 15.04 15.2 15.44 15.86 16.76 18.28 19.2
Najlepszym dplyr
równoważne mogę wymyślić coś takiego:
library(tidyr)
probs = seq(0, 1, 0.1)
mtcars %>%
group_by(cyl) %>%
do(data.frame(prob = probs, stat = quantile(.$mpg, probs = probs))) %>%
spread(prob, stat)
# cyl 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
# 1 4 21.4 21.50 22.80 22.80 24.40 26.0 27.30 30.40 30.40 32.40 33.9
# 2 6 17.8 17.98 18.32 18.98 19.40 19.7 20.48 21.00 21.00 21.16 21.4
# 3 8 10.4 11.27 13.90 14.66 15.04 15.2 15.44 15.86 16.76 18.28 19.2
Zauważ, że II również trzeba użyć tidyr::spread
. Ponadto zauważ, że utraciłem formatowanie kolumn nagłówków kolumn z korzyścią zastąpienia .id
wartością cyl
w pierwszej kolumnie.
Pytania:
- Czy istnieje lepszy
dplyr
oparty Podejście do realizacji tegotapply %>% ldply
łańcuch? - Czy istnieje sposób, aby uzyskać najlepsze z obu światów , nie przeskakując przez zbyt wiele obręczy? Oznacza to, że należy uzyskać formatowanie kolumny
%
i właściwą kolumnęcyl
dla pierwszej kolumny?
czy wyjaśnić "check.names = FALSE"? – JasonAizkalns
@JasonAlzkains Jest to argument w 'data.frame', gdzie domyślną opcją jest' check.names = TRUE'. Tak więc, jeśli nazwy kolumn zaczynają się od wartości nieliczbowych, zostanie do nich dodane wyrażenie "X". Odpowiedni kod to 'if (check.names) vnames <- make.names (vnames, unique = TRUE)' – akrun