Suche…


Summe jeder Spalte

Angenommen, wir müssen die sum jeder Spalte in einem Dataset durchführen

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])

Dafür gibt es viele Möglichkeiten. Bei Verwendung von base R wäre colSums die beste Option

colSums(df1[-1], na.rm = TRUE)

Hier haben wir die erste Spalte entfernt, da sie nicht numerisch ist, und die sum jeder Spalte angegeben, wobei na.rm = TRUE (falls NA im Datensatz vorhanden sind).

Dies funktioniert auch mit matrix

colSums(m1, na.rm = TRUE)

Dies kann in einer Schleife mit lapply/sapply/vapply

 lapply(df1[-1], sum, na.rm = TRUE)

Es ist zu beachten, dass die Ausgabe eine list . Wenn wir eine vector benötigen

 sapply(df1[-1], sum, na.rm = TRUE)

Oder

 vapply(df1[-1], sum, na.rm = TRUE, numeric(1))

Wenn Sie für Matrizen Spalten durchlaufen möchten, verwenden Sie apply mit MARGIN = 1

 apply(m1, 2, FUN = sum, na.rm = TRUE)

Es gibt Möglichkeiten, dies mit Paketen wie dplyr oder data.table zu tun

 library(dplyr)
 df1 %>%
     summarise_at(vars(matches("^V\\d+")), sum, na.rm = TRUE)

Hier übergeben wir einen regulären Ausdruck, um den Spaltennamen zu entsprechen, die wir benötigen, um die sum in summarise_at . Der reguläre Ausdruck stimmt mit allen Spalten überein, die mit V gefolgt von einer oder mehreren Zahlen ( \\d+ ).

Eine data.table Option ist

library(data.table)   
setDT(df1)[, lapply(.SD, sum, na.rm = TRUE), .SDcols = 2:ncol(df1)]

Wir konvertieren 'data.frame' in 'data.table' ( setDT(df1) ), spezifizieren die Spalten, auf die die Funktion in .SDcols angewendet werden .SDcols , durchlaufen die Teilmenge von Data.table ( .SD ) und erhalten die sum .


Wenn Sie eine Gruppe nach Operation verwenden müssen, können Sie dies leicht tun, indem Sie die Gruppe nach Spalte / Spalte angeben

 df1 %>%
   group_by(ID) %>%   
   summarise_at(vars(matches("^V\\d+")), sum, na.rm = TRUE)

In Fällen , in denen wir die brauchen sum aller Spalten, summarise_each kann anstelle verwendet werden summarise_at

df1 %>%
    group_by(ID) %>%
    summarise_each(funs(sum(., na.rm = TRUE)))

Die Option data.table lautet

setDT(df1)[, lapply(.SD, sum, na.rm = TRUE), by = ID]   


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow