R按行名称对行进行求和

时间:2016-12-27 23:14:38

标签: r matrix

这看起来应该很容易,但我无法弄清楚。我想总结我的矩阵中具有相同名称的所有列。因此,在下面的示例中,我想最终得到另一个只有三列的矩阵。

set.seed(4)
z<-matrix(sample(1:10,20, replace=T), nrow=4)
colnames(z)<-c("a","c","b","a","b")
z
     a  c  b  a  b
[1,] 6  9 10  2 10
[2,] 1  3  1 10  6
[3,] 3  8  8  5 10
[4,] 3 10  3  5  8

应该产生:

     a  c  b
[1,] 8  9 20
[2,] 11  3  7
[3,] 8  8  18
[4,] 8 10  11

我试过了:

z<-aggregate(colnames(z), data=z, sum)

但它不起作用。如果可能的话,我宁愿使用基数R.

4 个答案:

答案 0 :(得分:7)

您可以使用android:state_selected="true"将列名称设为rowsum变量:

group

答案 1 :(得分:2)

试试这个:

sapply(unique(colnames(z)), function(x) rowSums(z[, colnames(z)==x, drop=FALSE]))

答案 2 :(得分:1)

以下是使用xtabs

的选项
library(reshape2)
xtabs(value~Var1 +Var2, melt(z))
#    Var2
#Var1  a  c  b
#   1  8  9 20
#   2 11  3  7
#   3  8  8 18
#   4  8 10 11

tapply

tapply(z, list(row(z), colnames(z)[col(z)]), FUN = sum)
#    a  b  c
# 1  8 20  9
# 2 11  7  3
#3  8 18  8
#4  8 11 10

答案 3 :(得分:0)

这也可以。

set.seed(4)
z<-matrix(sample(1:10,20, replace=T), nrow=4)
colnames(z)<-c("a","c","b","a","b")
z <- as.data.table(z)
z[,id:=.I]
z <- melt(z,id.vars="id")
z[,sum:=sum(value),by=.(variable,id)]
z[,value:=NULL]
z <- dcast.data.table(z, id~variable,value.var = "sum", fun.aggregate = max)
z[,id:=NULL]

导致

    a  c  b
1:  8  9 20
2: 11  3  7
3:  8  8 18
4:  8 10 11