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]   


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow