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.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
供参考,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
轻松转换为数据框。
我是 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.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
供参考,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
轻松转换为数据框。