Ecco il mio problema:dplyr sintesi: creare variabili dal nome vettore
Sto usando una funzione che restituisce un vettore di nome. Ecco un esempio di giocattoli:
toy_fn <- function(x) {
y <- c(mean(x), sum(x), median(x), sd(x))
names(y) <- c("Right", "Wrong", "Unanswered", "Invalid")
y
}
Sto usando group_by in dplyr di applicare questa funzione per ogni gruppo (tipico split-apply-unire). Quindi, ecco il mio giocattolo data.frame:
set.seed(1234567)
toy_df <- data.frame(id = 1:1000,
group = sample(letters, 1000, replace = TRUE),
value = runif(1000))
Ed ecco il risultato sto puntando:
toy_summary <-
toy_df %>%
group_by(group) %>%
summarize(Right = toy_fn(value)["Right"],
Wrong = toy_fn(value)["Wrong"],
Unanswered = toy_fn(value)["Unanswered"],
Invalid = toy_fn(value)["Invalid"])
> toy_summary
Source: local data frame [26 x 5]
group Right Wrong Unanswered Invalid
1 a 0.5038394 20.15358 0.5905526 0.2846468
2 b 0.5048040 15.64892 0.5163702 0.2994544
3 c 0.5029442 21.62660 0.5072733 0.2465612
4 d 0.5124601 14.86134 0.5382463 0.2681955
5 e 0.4649483 17.66804 0.4426197 0.3075080
6 f 0.5622644 12.36982 0.6330269 0.2850609
7 g 0.4675324 14.96104 0.4692404 0.2746589
Funziona! Ma non è bello chiamare quattro volte la stessa funzione. Mi piacerebbe piuttosto che dplyr ottenga il vettore con nome e crei una nuova variabile per ogni elemento nel vettore. Qualcosa di simile a questo:
toy_summary <-
toy_df %>%
group_by(group) %>%
summarize(toy_fn(value))
Questo, purtroppo, non funziona perché "Errore: in attesa di un singolo valore".
Ho pensato, ok, convertiamo il vettore in un data.frame
utilizzando data.frame(as.list(x))
. Ma neanche questo funziona. Ho provato molte cose ma non ho potuto ingannare Dplyr per pensare che stia effettivamente ricevendo un singolo valore (osservazione) per 4 diverse variabili. C'è un modo per aiutare Dplyr a rendersene conto?
non sembra funzionare, però. –
L'ho provato sul mio computer - funziona, il frame dei dati risultante richiede un po 'di analisi. –
che tipo di parsing ?, ..., non ho potuto guardarlo attentamente perche 'l'ho controllato nel mio telefono. –