这是我认为您要问的一个巧妙的解决方案。(为了清楚起见,我将输入矩阵称为输入矩阵- 在此示例中,有 2 列和 10 行,并且行被命名为 abc1 到 abc10。mat
)k
mat
在下面的代码中,结果out1
是您想要计算的东西(apply 命令的结果)。结果与它out2
相同,out1
只是它打印出它正在处理的行名(我每行设置了 0.3 秒的延迟,所以你可以看到它确实这样做了 - 当你希望代码运行完整时将其删除速度明显!)
我想出的技巧是将行号(1 到 n)cbind 到mat
(以创建一个带有一个附加列的矩阵)的左侧,然后使用它来引用mat
. 注意x = y[-1]
表示函数内的实际计算(这里加 1)忽略行号的第一列的行,这意味着它与为out1
. 无论您想对行执行什么类型的计算,都可以通过这种方式完成 - 只需假装y
从未存在,然后使用x
. 希望这可以帮助。
set.seed(1234)
mat = as.matrix(data.frame(x = rpois(10,4), y = rpois(10,4)))
rownames(mat) = paste("abc", 1:nrow(mat), sep="")
out1 = apply(mat,1,function(x) {x+1})
out2 = apply(cbind(seq_len(nrow(mat)),mat),1,
function(y) {
x = y[-1]
cat("Doing row:",rownames(mat)[y[1]],"\n")
Sys.sleep(0.3)
x+1
}
)
identical(out1,out2)