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]   


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow