在矩阵中按组求和

pom*_*ate 6 r matrix

假设我有一个叫做矩阵的矩阵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), .Dimnames = list(c("Cake", "Pie", "Cake", "Pie", "Pie"),
c("Mon", "Tue", "Wed", "Thurs"))) 

x
     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
Run Code Online (Sandbox Code Playgroud)

我希望它成为:

     Mon   Tue   Wed   Thurs
Cake   2     1     1      2
Pie    0     0     3      3
Run Code Online (Sandbox Code Playgroud)

我尝试过使用addmargins(x),但这只是给了我每列和每行的总和.有什么建议?我搜索了其他问题,但无法解决这个问题.

Dav*_*urg 8

这是一个矢量化的基础解决方案

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

或者data.table使用版本keep.rownames = TRUE将您的行名称转换为列

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
Run Code Online (Sandbox Code Playgroud)


Mam*_*zal 6

你可以试试这个

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
Run Code Online (Sandbox Code Playgroud)

还有 dplyr

library(dplyr)
group_by(df, Name) %>%
    summarise(Mon = sum(Mon), Tue = sum(Tue), Wed = sum(Wed), Thurs = sum(Thurs))
Run Code Online (Sandbox Code Playgroud)

或更好

 group_by(df, Name) %>%
    summarise_each(funs(sum))
Run Code Online (Sandbox Code Playgroud)