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]