如何编写仅适用于 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()
函数来做到这一点?
请注意,这是一个简化的示例。在我正在使用的更完整的代码中,矩阵根据用户输入动态 expands/contracts 因此我需要一个 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
假设我们有一个如下所示的“测试”矩阵:(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()
函数来做到这一点?
请注意,这是一个简化的示例。在我正在使用的更完整的代码中,矩阵根据用户输入动态 expands/contracts 因此我需要一个 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