r - 矩阵 : Summing columns and rows conditional on variable name

标签 r

假设我有一个像这样的简单 6x6 矩阵:

x <- matrix(1:36, nrow = 6, dimnames = list(c("AUS1","AUS2","AUS3", "AUT1", "AUT2", "AUT3"), c("AUS1","AUS2","AUS3", "AUT1", "AUT2", "AUT3")))

     AUS1 AUS2 AUS3 AUT1 AUT2 AUT3
AUS1    1    7   13   19   25   31
AUS2    2    8   14   20   26   32
AUS3    3    9   15   21   27   33
AUT1    4   10   16   22   28   34
AUT2    5   11   17   23   29   35
AUT3    6   12   18   24   30   36

字母代表一个国家(AUS 为澳大利亚),后面的数字代表一个部门。现在,我想对每一列求和,但条件是仅从不来自同一国家/地区的行中获取值。例如,第一列 (AUS1) 的总和应仅包含行 AUT1、AUT2 和 AUT3 的值。 AUS2 和 AUS3 的列也是如此。 AUT1 列的总和应仅包括 AUS1、AUS2 和 AUS3 行的值。

由于我的表格比这大得多,我不能简单地选择单独的行。

我正在考虑将部分列名与部分行名相匹配的函数。如果它们包含相同的三个字母,则该值不包括在总和中。

最佳答案

这是一个基本的 R 方式。它运行三个循环,但由于前两个(lapply 循环)针对行名和列名,因此这两个循环不会花费太多处理时间。
然后真正的工作在 Map 循环中完成,对之前确定的行和列名称的子集调用 rowSums

x <- matrix(1:36, nrow = 6, dimnames = list(c("AUS1","AUS2","AUS3", "AUT1", "AUT2", "AUT3"), c("AUS1","AUS2","AUS3", "AUT1", "AUT2", "AUT3")))

rn <- unique(gsub("\\d", "", rownames(x)))
rows <- lapply(rn, grep, rownames(x))
cols <- lapply(rn, grep, colnames(x), invert = TRUE)

Map(\(r, c) rowSums(x[r, c]), rows, cols)
#> [[1]]
#> AUS1 AUS2 AUS3 
#>   75   78   81 
#> 
#> [[2]]
#> AUT1 AUT2 AUT3 
#>   30   33   36

reprex package 创建于 2022-05-18 (v2.0.1)

关于r - 矩阵 : Summing columns and rows conditional on variable name,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72287811/

相关文章:

r - 在Rmarkdown中创建动态标签

r - 将 x Axis 放置在具有负 y 值的条形图顶部

r - 创建一个由向量​​列表组成的新向量

r - 在适用于 R 的 Shiny 应用程序中,如何延迟响应式的触发?

r - 计算列表中的值并创建包含计数的新列

r - data.table v.1.11.0+ 不再读取由 v.1.10.4-3 读取的数据文件

R ggplot2 - 简单绘图 - 无法指定对数轴限制

R 数据表 setkey - 错误某些列不在 data.table 中

string - 如何将字符串转换为R中的数学表达式?

r - 带有facet_wrap的ggplot boxplot中没有异常值