我是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的行名称值的列。
答案 0 :(得分:1)
基于data.table
和reshape2
包的解决方案:
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
轻松转换为数据框。