繁体   English   中英

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

[英]How to write an apply() function that only applies to odd-numbered columns in r matrix?

假设我们有一个如下所示的“测试”矩阵: (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

您可以使用模%% 2

odd <- !seq(ncol(test)) %% 2 == 0
test[, odd] <- apply(test[, odd], 2, function(x) {return(x + 1)}) 
#      [,1] [,2] [,3] [,4]
# [1,]    2    4    8   10
# [2,]    3    5    9   11
# [3,]    4    6   10   12

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM