R:基于rowname对循环中的行求和

时间:2016-01-28 15:28:14

标签: r sum conditional

我是R的新手,会发现一些非常有帮助的提示。

我填充了矩阵X,其中包含了数字的rownames列表。

这些对应于矩阵(Y)。

我想根据Matrix X中的rownames总结矩阵Y中的所有行。

所以X [,1]可能包含一个rownames列表,我想在矩阵Y中提取这些特定行的行和。

我认为我遇到困难的地方是将rownames()放在语句中 - 我已尝试使用函数的许多不同组合,with和if。非常感谢任何指导或提示。谢谢。

我在下面提供了问题的简化版本:

    X              Y
    1 2            10  10  10
    3 3            20  20  20
    5 4            30  30  30
                   40  40  40
                   50  50  50

    Z[1] (X[,1]) should equal [10+10+10]+[30+30+30]+[50+50+50]
    Z[2] (X[,2]) should equal [20+20+20]+[30+30+30]+[40+40+40]

Z应该是Y行的总和的向量,具体取决于X的行名称值的列。

2 个答案:

答案 0 :(得分:1)

基于data.tablereshape2包的解决方案:

library(data.table)
library(reshape2)

X <- matrix(c(1,3,5,2,3,4), nrow = 3, ncol = 2)
Y <- 10*matrix(rep(1:5, each = 3), nrow = 5, byrow = TRUE)

# Convert to data.table
X.DT <- data.table(X)
Y.DT <- data.table(Y)

Z.DT <- 
  # First melt the X to get the column names as grouping 'variable'
  # and the numeric values in 'value'
  melt(X.DT, measure.vars = names(X.DT))[
    # Sum the values of Y selected by the indicies stored in X 
  , .(Z = sum(Y.DT[value]))
  , by = variable
]

Z.DT

结果如下所示:

   variable   Z
1:       V1 270
2:       V2 270

如果您需要将结果作为简单的向量Z,那么您可以这样做:

Z <- Z.DT[,Z]
Z
[1] 270 270

作为参考,data.table函数返回的中间melt如下所示:

> melt(X.DT, measure.vars = names(X.DT))
   variable value
1:       V1     1
2:       V1     3
3:       V1     5
4:       V2     2
5:       V2     3
6:       V2     4

答案 1 :(得分:1)

您可以按如下方式实现:

x <- data.frame(x)
sapply(x, function(r) sum(y[r, ]))

输出是:

 X1  X2 
270 270 

或者,您可以命名matrix x的列,并将其提供给sapply。在这种情况下,我将x轻松转换为数据框。