gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:51:22 25 4
gpt4 key购买 nike

假设我有一个像这样的简单 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com