这里有一个巧妙的解决办法是什么我想你在问。 (我称为输入矩阵mat
而非k
为清楚起见 - 在这个例子中,具有mat
2列和10行,并且行是通过命名ABC1到abc10。)
在下面的代码,结果out1
是你想要计算的东西(apply命令的结果)。 out2
的结果与out1
完全相同,不同之处在于它打印出了正在处理的rownames(我将每行延迟0.3秒,因此您可以看到它确实可以做到这一点 - 当您希望代码运行全速显然!)
我想出的技巧是将行号(1到n)放在mat
(创建一个额外的列的矩阵)的左侧,然后用它来回引用到mat
的rownames。注意行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)
你能澄清你期待的答案吗?如果你在'k'的第一个实例中给每个数字加1,那么你在第二个'k'实例中没有得到答案。 – ChrisW
只是使用for循环。 – joran
这里有很多非常混乱的建议 - 如果我提出的解决方案能够满足您的要求,您可以告诉我吗? –