In definitiva, io sto cercando di realizzare qualcosa di simile a quanto segue, ma sfruttando dplyr
invece di plyr
:Qual è l'equivalente dplyr di plyr :: ldply (tapply) in 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
Il miglior dplyr
equivalente posso venire in mente è qualcosa di simile:
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
Si noti che è necessario utilizzare anche lo tidyr::spread
. Inoltre, si noti che ho perso la formattazione %
per le intestazioni di colonna a vantaggio della sostituzione di .id
con cyl
nella prima colonna.
Domande:
- c'è una migliore
dplyr
approccio alla realizzazione di questotapply %>% ldply
catena? - C'è un modo per ottenere il meglio da entrambi i mondi senza saltare attraverso troppi cerchi? Vale a dire, ottenere la formattazione e il corretto nome colonna
cyl
per la prima colonna?
cura di spiegare 'check.names = FALSE'? – JasonAizkalns
@JasonAlzkains È un argomento in 'data.frame' dove l'opzione predefinita è' check.names = TRUE'. Quindi, se i nomi delle colonne iniziano con valori non numerici, verrà aggiunto "X" ad esso. Il codice rilevante è 'if (check.names) vnames <- make.names (vnames, unique = TRUE)' – akrun