Un'operazione incredibilmente comune per il mio tipo di dati è l'applicazione di un fattore di normalizzazione a tutte le colonne. Questo può essere fatto in modo efficiente utilizzando sweep
o scale
:Come faccio a spazzare colonne specifiche con dplyr?
normalized = scale(data, center = FALSE, scale = factors)
# or
normalized = sweep(data, 2, factors, `/`)
Dove
data = structure(list(A = c(3L, 174L, 6L, 1377L, 537L, 173L),
B = c(1L, 128L, 2L, 1019L, 424L, 139L),
C = c(3L, 66L, 2L, 250L, 129L, 40L),
D = c(4L, 57L, 4L, 251L, 124L, 38L)),
.Names = c("A", "B", "C", "D"),
class = c("tbl_df", "data.frame"), row.names = c(NA, -6L))
factors = c(A = 1, B = 1.2, C = 0.8, D = 0.75)
Tuttavia, come faccio a fare questo con dplyr, quando i miei dati ha colonne aggiuntive di fronte? Posso farlo in dichiarazioni separate, ma mi piacerebbe farlo in una pipeline. Questi sono i miei dati:
data = structure(list(ID = c(1, 2, 3, 4, 5, 6),
Type = c("X", "X", "X", "Y", "Y", "Y"),
A = c(3L, 174L, 6L, 1377L, 537L, 173L),
B = c(1L, 128L, 2L, 1019L, 424L, 139L),
C = c(3L, 66L, 2L, 250L, 129L, 40L),
D = c(4L, 57L, 4L, 251L, 124L, 38L)),
.Names = c("ID", "Type", "A", "B", "C", "D"),
class = c("tbl_df", "data.frame"), row.names = c(NA, -6L))
E mi piacerebbe mutare le colonne di dati senza toccare le prime due colonne. Normalmente posso farlo con mutate_each
; tuttavia, come non posso passare i miei fattori di normalizzazione a tale funzione:
data %>% mutate_each(funs(./factors), A:D)
Questo, ovviamente, presuppone che voglio dividere ogni colonna da factors
, piuttosto che ogni colonna per il suo fattore di adattamento.
Forse questo aiuta 'data%>% elenco (as.list (fattori))%>% Riduzione ('/',.)' – akrun
@akrun No, questo non funziona affatto. –
La mia soluzione era basata sul primo set di dati – akrun