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]   


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow