R Language
Kolomgewijze bediening
Zoeken…
som van elke kolom
Stel dat we de sum
van elke kolom in een gegevensset moeten doen
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])
Er zijn veel manieren om dit te doen. Met base R
is colSums
de beste optie
colSums(df1[-1], na.rm = TRUE)
Hier hebben we de eerste kolom verwijderd, omdat deze niet-numeriek is en de sum
van elke kolom hebben na.rm = TRUE
, waarbij de na.rm = TRUE
(in het geval dat er NA's in de gegevensset zijn)
Dit werkt ook met matrix
colSums(m1, na.rm = TRUE)
Dit kan gedaan worden in een lus met lapply/sapply/vapply
lapply(df1[-1], sum, na.rm = TRUE)
Opgemerkt moet worden dat de uitvoer een list
. Als we een vector
output nodig hebben
sapply(df1[-1], sum, na.rm = TRUE)
Of
vapply(df1[-1], sum, na.rm = TRUE, numeric(1))
Als we voor matrices kolommen willen doorlopen, gebruik dan apply
met MARGIN = 1
apply(m1, 2, FUN = sum, na.rm = TRUE)
Er zijn manieren om dit te doen met pakketten zoals dplyr
of data.table
library(dplyr)
df1 %>%
summarise_at(vars(matches("^V\\d+")), sum, na.rm = TRUE)
Hier geven we een reguliere expressie door die overeenkomt met de kolomnamen die we nodig hebben om de sum
in summarise_at
. De regex komt overeen met alle kolommen die beginnen met V
gevolgd door een of meer getallen ( \\d+
).
Een optie voor data.table
is
library(data.table)
setDT(df1)[, lapply(.SD, sum, na.rm = TRUE), .SDcols = 2:ncol(df1)]
We converteren het 'data.frame' naar 'data.table' ( setDT(df1)
), specificeerden de kolommen die de functie .SDcols
toepassen in .SDcols
en doorlopen de Subset van Data.table ( .SD
) en krijgen de sum
.
Als we per groep een groep moeten gebruiken, kunnen we dit eenvoudig doen door de groep op te geven per kolom / kolommen
df1 %>%
group_by(ID) %>%
summarise_at(vars(matches("^V\\d+")), sum, na.rm = TRUE)
In gevallen waarin we de sum
van alle kolommen nodig hebben, kan summarise_each
worden gebruikt in plaats van summarise_at
df1 %>%
group_by(ID) %>%
summarise_each(funs(sum(., na.rm = TRUE)))
De optie data.table
is
setDT(df1)[, lapply(.SD, sum, na.rm = TRUE), by = ID]