R Language
Mądra operacja na kolumnie
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]