r - 如何编写仅适用于 r 矩阵中奇数列的 apply() 函数?

标签 r matrix apply

假设我们有一个如下所示的“测试”矩阵: (1,2,3, 4,5,6, 7,8,9, 10,11,12) 通过运行 test <- matrix(1:12, ncol = 4) 生成.一个简单的 3 x 4(行 x 列)矩阵,包含从 1 到 12 的数字。

现在假设我们想为每个 奇数 矩阵列中的每个元素添加一个值 1,所以我们最终得到一个包含以下值的矩阵:(2,3, 4、4、5、6、8、9、10、10、11、12)。我们将如何使用 apply()这样做的功能?

请注意,这是一个简化的示例。在我正在使用的更完整的代码中,矩阵根据用户输入动态扩展/收缩,所以我需要一个 apply()计算矩阵列的实际数量的函数,而不是在上面的示例中使用 4 列的固定假设。 (而且我没有向元素添加值 1;我正在运行并行最小值函数 test[,1] <- pmin(test1[,1], 5) 来将每个值限制为最大值 5)。

我目前对 apply() 的了解有限函数族,到目前为止我所能做的就是apply(test, 2, function(x) {return(x+1)})但这是将值 1 添加到所有列中的所有元素,而不仅仅是奇数列。

最佳答案

您可以简单地对输入数据框进行子集化以仅访问奇数或偶数列。考虑:

test[c(TRUE, FALSE)] <- apply(test[c(TRUE, FALSE)], 2, function(x) f(x))
test[c(FALSE, TRUE)] <- apply(test[c(FALSE, TRUE)], 2, function(x) f(x))

这是可行的,因为 R 中的回收规则会导致例如c(TRUE, FALSE)需要重复多次才能覆盖输入 test 中的所有列数据框。

对于矩阵,我们需要使用 drop=FALSE对矩阵进行子集化时的标志,以便在使用 apply() 时保持矩阵形式:

test <- matrix(1:12, ncol = 4)
test[,c(TRUE, FALSE)] <- apply(test[,c(TRUE, FALSE),drop=FALSE], 2, function(x) x+1)
test

     [,1] [,2] [,3] [,4]
[1,]    2    4    8   10
[2,]    3    5    9   11
[3,]    4    6   10   12
        ^         ^ ... these columns incremented by 1

关于r - 如何编写仅适用于 r 矩阵中奇数列的 apply() 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69960690/

相关文章:

重铸任意深度的嵌套列表

r - 使用 dplyr 中的 mutate 对 R 中的自定义函数中的分组数据使用数据框和列作为参数

python - Numpy:从子矩阵广播

python - 如何使用 Julia 查找矩阵中的连通分量

r - 将 data.frame 滞后 NA 的数量

R 用户定义的函数单独工作,但在与 apply 一起使用时返回不正确的值

R + 将向量列表合并为单个向量

r - col2rgb(d) : invalid color name in tweenr 中的错误

python - 如何绘制混淆矩阵?

python - 如何使用 apply 来实现这个功能