R Language
Operazione su colonna
Ricerca…
somma di ogni colonna
Supponiamo di dover fare la sum
di ogni colonna in un set di dati
set.seed(20)
df1 <- data.frame(ID = rep(c("A", "B", "C"), each = 3), V1 = rnorm(9), V2 = rnorm(9))
m1 <- as.matrix(df1[-1])
Ci sono molti modi per farlo. Usando la base R
, l'opzione migliore sarebbe colSums
colSums(df1[-1], na.rm = TRUE)
Qui, abbiamo rimosso la prima colonna dato che non è numerica e ha fatto la sum
di ogni colonna, specificando na.rm = TRUE
(nel caso ci siano NA nel set di dati)
Funziona anche con la matrix
colSums(m1, na.rm = TRUE)
Questo può essere fatto in un ciclo con lapply/sapply/vapply
lapply(df1[-1], sum, na.rm = TRUE)
Va notato che l'output è una list
. Se abbiamo bisogno di un output vector
sapply(df1[-1], sum, na.rm = TRUE)
O
vapply(df1[-1], sum, na.rm = TRUE, numeric(1))
Per le matrici, se si desidera eseguire il ciclo delle colonne, utilizzare apply
con MARGIN = 1
apply(m1, 2, FUN = sum, na.rm = TRUE)
Ci sono modi per farlo con pacchetti come dplyr
o data.table
library(dplyr)
df1 %>%
summarise_at(vars(matches("^V\\d+")), sum, na.rm = TRUE)
Qui, stiamo passando un'espressione regolare per abbinare i nomi delle colonne di cui abbiamo bisogno per ottenere la sum
in summarise_at
. La regex corrisponderà a tutte le colonne che iniziano con V
seguito da uno o più numeri ( \\d+
).
Un'opzione data.table
è
library(data.table)
setDT(df1)[, lapply(.SD, sum, na.rm = TRUE), .SDcols = 2:ncol(df1)]
Convertiamo 'data.frame' in 'data.table' ( setDT(df1)
), specificate le colonne da applicare alla funzione in .SDcols
e .SDcols
attraverso il Sottoinsieme di Data.table ( .SD
) e ottenete la sum
.
Se abbiamo bisogno di utilizzare un gruppo per operazione, possiamo farlo facilmente specificando il gruppo per colonna / colonna
df1 %>%
group_by(ID) %>%
summarise_at(vars(matches("^V\\d+")), sum, na.rm = TRUE)
Nel caso in cui abbiamo bisogno della sum
di tutte le colonne, summarise_each
può essere usato al posto di summarise_at
df1 %>%
group_by(ID) %>%
summarise_each(funs(sum(., na.rm = TRUE)))
L'opzione data.table
è
setDT(df1)[, lapply(.SD, sum, na.rm = TRUE), by = ID]