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