R Language
Kolumnvis funktion
Sök…
summan av varje kolumn
Anta att vi måste göra sum
av varje kolumn i ett dataset
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])
Det finns många sätt att göra detta. Med base R
är det bästa alternativet colSums
colSums(df1[-1], na.rm = TRUE)
Här har vi tagit bort den första kolumnen eftersom den är icke-numerisk och gjorde sum
av varje kolumn, med angivande av na.rm = TRUE
(om det finns några NA i datasatsen)
Detta fungerar också med matrix
colSums(m1, na.rm = TRUE)
Detta kan göras i en slinga med lapply/sapply/vapply
lapply(df1[-1], sum, na.rm = TRUE)
Det bör noteras att utgången är en list
. Om vi behöver en vector
sapply(df1[-1], sum, na.rm = TRUE)
Eller
vapply(df1[-1], sum, na.rm = TRUE, numeric(1))
För matriser, om vi vill slinga igenom kolumner, använd sedan apply
med MARGIN = 1
apply(m1, 2, FUN = sum, na.rm = TRUE)
Det finns sätt att göra detta med paket som dplyr
eller data.table
library(dplyr)
df1 %>%
summarise_at(vars(matches("^V\\d+")), sum, na.rm = TRUE)
Här passerar vi ett regelbundet uttryck för att matcha kolumnnamnen som vi behöver för att få sum
i summarise_at
. Regexet matchar alla kolumner som börjar med V
följt av ett eller flera nummer ( \\d+
).
Ett data.table
alternativ är
library(data.table)
setDT(df1)[, lapply(.SD, sum, na.rm = TRUE), .SDcols = 2:ncol(df1)]
Vi konverterar 'data.frame' till 'data.table' ( setDT(df1)
), specificerade kolumnerna som ska tillämpas funktionen i .SDcols
och loop genom underuppsättningen Data.table ( .SD
) och får sum
.
Om vi behöver använda en grupp efter operation kan vi göra det enkelt genom att ange gruppen efter kolumn / kolumner
df1 %>%
group_by(ID) %>%
summarise_at(vars(matches("^V\\d+")), sum, na.rm = TRUE)
I de fall där vi behöver sum
av alla kolumner kan summarise_each
användas istället för summarise_at
df1 %>%
group_by(ID) %>%
summarise_each(funs(sum(., na.rm = TRUE)))
data.table
är
setDT(df1)[, lapply(.SD, sum, na.rm = TRUE), by = ID]