Szukaj…


suma każdej kolumny

Załóżmy, że musimy wykonać sum każdej kolumny w zbiorze danych

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

Istnieje wiele sposobów, aby to zrobić. Korzystając z base R , najlepszą opcją byłoby colSums

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

Tutaj usunęliśmy pierwszą kolumnę, ponieważ jest ona nienumeryczna i zrobiliśmy sum każdej kolumny, określając na.rm = TRUE (w przypadku, gdy w zbiorze danych znajdują się NA)

Działa to również z matrix

colSums(m1, na.rm = TRUE)

Można to zrobić w pętli z lapply/sapply/vapply

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

Należy zauważyć, że wynikiem jest list . Jeśli potrzebujemy wyjścia vector

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

Lub

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

W przypadku macierzy, jeśli chcemy przechodzić przez kolumny, to apply z MARGIN = 1

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

dplyr to zrobić za pomocą pakietów takich jak dplyr lub data.table

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

Przekazujemy tutaj wyrażenie regularne pasujące do nazw kolumn potrzebnych do uzyskania sum w summarise_at . Wyrażenie regularne dopasuje wszystkie kolumny rozpoczynające się od V po której następuje jedna lub więcej liczb ( \\d+ ).

data.table jest

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

Konwertujemy „data.frame” na „data.table” ( setDT(df1) ), setDT(df1) kolumny do zastosowania funkcji w .SDcols i zapętlamy podzbiór Data.table ( .SD ) i otrzymujemy sum .


Jeśli potrzebujemy użyć grupy według operacji, możemy to zrobić łatwo, określając grupę według kolumny / kolumn

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

W przypadkach, gdy potrzebujemy sum wszystkich kolumn, zamiast summarise_each można użyć summarise_at

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

Opcja data.table to

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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow