gpt4 book ai didi

r - 在(反)对角线上应用函数

转载 作者:行者123 更新时间:2023-12-04 01:17:42 27 4
gpt4 key购买 nike

我们知道base中的apply()可以对数组的边距应用一个函数,边距应该是行或列。我想将边距扩大到“对角线”“反对角线”。结构看起来像

diagApply <- function(x, FUN, ..., anti = FALSE) {  }

我将此函数命名为 diagApply 并且参数 anti“对角线”“反对角线” FUN 将被应用(默认为 FALSE)。以 3x4 矩阵为例:

mat <- matrix(letters[1:12], 3, 4)

# [,1] [,2] [,3] [,4]
# [1,] "a" "d" "g" "j"
# [2,] "b" "e" "h" "k"
# [3,] "c" "f" "i" "l"

假设我需要在每个(反)对角线上粘贴元素。使用 apply()-like 方式,函数应该执行为

diagApply(mat, paste, collapse = ".")              # code 1
diagApply(mat, paste, collapse = ".", anti = TRUE) # code 2

预期的输出将是

list("c", "b.f", "a.e.i", "d.h.l", "g.k", "j")  # output of code 1
list("a", "d.b", "g.e.c", "j.h.f", "k.i", "l") # output of code 2

是否有任何现有功能可以实现该功能?如果没有,希望有人可以就此问题分享您的想法。提前致谢!

最佳答案

在其他评论的基础上,您可以从任何角度做一些更通用的事情:

diagApply(mat, 1, toString)
# [1] "c" "b, f" "a, e, i" "d, h, l" "g, k" "j"
diagApply(mat, 2, toString)
# [1] "a" "b, d" "c, e, g" "f, h, j" "i, k" "l"
diagApply(mat, 3, toString)
# [1] "j" "g, k" "d, h, l" "a, e, i" "b, f" "c"
diagApply(mat, 4, toString)
# [1] "l" "i, k" "f, h, j" "c, e, g" "b, d" "a"

您可以通过以下方式获得您想要的结果

diagApply(mat, 1, paste, collapse = '.', SIMPLIFY = FALSE)
diagApply(mat, 2, paste, collapse = '.', SIMPLIFY = FALSE)

我不确定元素的顺序有多重要,但如果需要,您可以将 rev 传递给 FUN

diagApply <- function(X, MARGIN, FUN, ..., SIMPLIFY = TRUE) {
idx <- switch(
MARGIN,
col(X) - row(X),
row(X) + col(X),
(col(X) - row(X)) * -1L,
(row(X) + col(X)) * -1L,
stop('\'MARGIN\' should be 1, 2, 3, or 4')
)

res <- unname(lapply(split(X, idx), FUN, ...))

if (!isFALSE(SIMPLIFY) && length(res))
simplify2array(res, higher = (SIMPLIFY == 'array'))
else res
}

关于r - 在(反)对角线上应用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63057913/

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