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

Cur*_*072 4 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,而不仅仅是奇数列。

Tim*_*sen 6

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

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))
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为 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
Run Code Online (Sandbox Code Playgroud)