R:根据行名对循环中的行求和

R: Summing rows in a loop based on rowname

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

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

这些对应矩阵(Y)。

我想根据矩阵 X 中的行名对矩阵 Y 中的所有行求和。

所以 X[1] 可能包含一个行名列表,我想在矩阵 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 的行名称值的列。

基于 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

供参考,melt 函数返回的中介 data.table 如下所示:

> 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

您可以通过以下方式实现:

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

输出为:

 X1  X2 
270 270 

或者,您可以命名 matrix x 的列并提供它们以进行应用。在这种情况下,我将 x 轻松转换为数据框。