R Language
Spaltenweiser Betrieb
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]