Sum columns by group (row names) in a matrix

前端 未结 3 1824
迷失自我
迷失自我 2020-12-11 17:01

Let\'s say I have a matrix called x.

x <- structure(c(1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1), 
.Dim = c(5L, 4L), .Dimname         


        
相关标签:
3条回答
  • 2020-12-11 17:17

    Here's a vectorized base solution

    rowsum(df, row.names(x))
    #      Mon Tue Wed Thurs
    # Cake   2   1   1     2
    # Pie    0   0   3     3
    

    Or data.table version using keep.rownames = TRUE in order to convert your row names to a column

    library(data.table)
    as.data.table(x, keep.rownames = TRUE)[, lapply(.SD, sum), by = rn]
    #      rn Mon Tue Wed Thurs
    # 1: Cake   2   1   1     2
    # 2:  Pie   0   0   3     3
    
    0 讨论(0)
  • 2020-12-11 17:17

    You can try this

    df <- read.table(head=TRUE, text="
    Name       Mon   Tue   Wed   Thurs
    Cake   1     0     1      1
    Pie    0     0     1      1
    Cake   1     1     0      1
    Pie    0     0     1      1
    Pie    0     0     1      1")
    
    aggregate(. ~ Name, data=df, FUN=sum)
    ##   Name Mon Tue Wed Thurs
    ## 1 Cake   2   1   1     2
    ## 2  Pie   0   0   3     3
    

    also with dplyr

    library(dplyr)
    group_by(df, Name) %>%
        summarise(Mon = sum(Mon), Tue = sum(Tue), Wed = sum(Wed), Thurs = sum(Thurs))
    

    or better

     group_by(df, Name) %>%
        summarise_each(funs(sum))
    
    0 讨论(0)
  • 2020-12-11 17:29

    An approach using plyr:

    ldply(split(df, df$Name), function(u) colSums(u[-1]))
    #   .id Mon Tue Wed Thurs
    #1 Cake   2   1   1     2
    #2  Pie   0   0   3     3
    

    Data:

    df = structure(list(Name = structure(c(1L, 2L, 1L, 2L, 2L), .Label = c("Cake", 
    "Pie"), class = "factor"), Mon = c(1L, 0L, 1L, 0L, 0L), Tue = c(0L, 
    0L, 1L, 0L, 0L), Wed = c(1L, 1L, 0L, 1L, 1L), Thurs = c(1L, 1L, 
    1L, 1L, 1L)), .Names = c("Name", "Mon", "Tue", "Wed", "Thurs"
    ), row.names = c(NA, -5L), class = "data.frame")
    
    0 讨论(0)
提交回复
热议问题