In this blog post, Paul Hiemstra mostra come riassumere due colonne utilizzando dplyr::mutate_
. Copia/incolla-ing parti rilevanti:Utilizzo di 'mutate_' per sommare un gruppo di colonne per riga
library(lazyeval)
f = function(col1, col2, new_col_name) {
mutate_call = lazyeval::interp(~ a + b, a = as.name(col1), b = as.name(col2))
mtcars %>% mutate_(.dots = setNames(list(mutate_call), new_col_name))
}
permette di fare poi:
head(f('wt', 'mpg', 'hahaaa'))
Grande!
Ho seguito una domanda (vedi commenti) su come estendere questo a 100 colonne, poiché non era chiaro (per me) come si potesse fare senza dover digitare tutti i nomi usando il metodo sopra. Paul è stato così gentile di indulgere me e ha fornito questa risposta (grazie!):
# data
df = data.frame(matrix(1:100, 10, 10))
names(df) = LETTERS[1:10]
# answer
sum_all_rows = function(list_of_cols) {
summarise_calls = sapply(list_of_cols, function(col) {
lazyeval::interp(~col_name, col_name = as.name(col))
})
df %>% select_(.dots = summarise_calls) %>% mutate(ans1 = rowSums(.))
}
sum_all_rows(LETTERS[sample(1:10, 5)])
Mi piacerebbe migliorare questa risposta su questi punti:
Le altre colonne sono andati. Mi piacerebbe tenerli.
Esso utilizza
rowSums()
che deve costringere il data.frame ad una matrice di che vorrei evitare.Anche io non sono sicuro se l'uso di
.
all'interno nondo()
verbi è incoraggiato? Perché.
all'interno dimutate()
non sembra adattarsi solo a quelle righe quando viene utilizzato congroup_by()
.E, cosa più importante, come posso fare lo stesso utilizzando
mutate_()
anzichémutate()
?
ho trovato this answer, che affronta il punto 1, ma purtroppo, entrambe le risposte dplyr
utilizzare rowSums()
con mutate()
.
PS: Ho appena letto Hadley's comment under that answer. IIUC, 'risagoma a forma lunga + gruppo per + somma + risagoma a forma estesa' è il modo consigliato per questo tipo di operazioni? dplyr
?
Non c'è bisogno di 'biblioteca (lazyeval)' quando si qualificano in modo esplicito il suo utilizzo in ogni caso. –