【问题标题】:R: Summing rows in a loop based on rownameR:根据行名对循环中的行求和
【发布时间】:2016-01-29 00:40:45
【问题描述】:

我是 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 的行名称值的列。

【问题讨论】:

  • 你想要的输出是什么,一个数字还是一个向量? sum(Y[X[, 1], ])rowSums(Y[X[, 1], ]) 关闭了吗?
  • 不就是z <- rowSums(Y); sapply(X, function(x) sum(z[x]))吗?编辑:还没有看到编辑,@rawr,但是是的,我要说的第一个选项。
  • 我想要的输出将是基于 X 的每一列中的行名的矩阵 Y 的行之和的向量。对不起,我应该说这是问题的简化版本。我的矩阵要大得多。

标签: r sum conditional


【解决方案1】:

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

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

输出是:

 X1  X2 
270 270 

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

【讨论】:

  • 我不应该重复使用 x 作为函数参数,因为它会混淆。真的,sapplyx 列提供给函数,用于索引y 的行以进行求和。
【解决方案2】:

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

【讨论】:

  • 谢谢!这些包看起来很有用。
  • 不客气!对于任何现实世界的数据工作,我不会尝试在没有“data.table”的情况下进行。
  • 我明白了!我以后肯定会更多地使用数据表命令。
猜你喜欢
  • 2023-01-16
  • 1970-01-01
  • 2019-01-09
  • 2021-11-25
  • 1970-01-01
  • 2021-08-09
  • 2023-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多