如果想要apply
一个功能,即对于矩阵的每一行,但又想要将该行的数量用作该函数的参数,该怎么办?例如,假设您想获得矩阵每行中数字的第n个根,其中n是行号。还有另一种方法(仅使用apply
)而不是将行号绑定到初始矩阵,就像这样吗?
test <- data.frame(x=c(26,21,20),y=c(34,29,28))
t(apply(cbind(as.numeric(rownames(test)),test),1,function(x) x[2:3]^(1/x[1])))
P.S。实际上,如果 test 真的是一个矩阵:test <- matrix(c(26,21,20,34,29,28),nrow=3)
,rownames(test)没有帮助:(
谢谢。
答案 0 :(得分:31)
我通常做的是在行号sapply
而不是1:nrow(test)
上运行test
,并在函数中使用test[i,]
:
t(sapply(1:nrow(test), function(i) test[i,]^(1/i)))
我不确定这是否真的有效。
答案 1 :(得分:3)
如果您为函数指定名称而不是匿名,则可以更轻松地传递参数。我们可以使用nrow
来获取行数,并将行号的向量作为参数传递,以及以这种方式索引的帧。
为了清楚起见,我使用了不同的示例函数;此示例将列x与列y相乘,得到2列矩阵:
test <- data.frame(x=c(26,21,20),y=c(34,29,28))
myfun <- function(position, df) {
print(df[position,1] * df[position,2])
}
positions <- 1:nrow(test)
lapply(positions, myfun, test)
答案 2 :(得分:2)
实际上,对于矩阵,您甚至不需要apply
。只是:
test^(1/row(test))
我想,做你想做的事。我认为row()
函数就是你要找的东西。
答案 3 :(得分:2)
cbind()
行数似乎是一种非常简单的方法。对于矩阵(或数据框),以下内容应该有效:
apply( cbind(1:(dim(test)[1]), test), 1, function(x) plot(x[-1], main=x[1]) )
或者你想要绘制的任何内容。
答案 4 :(得分:0)
我有点困惑,所以请原谅我,如果我弄错了,但是你想要在矩阵的每一行中找出数字的第n个根,其中n =行数。如果是这种情况,那么它非常简单地创建一个与原始数据尺寸相同的新数组,每个列具有与相应行数相同的值:
test_row_order = array(seq(1:length(test[,1]), dim = dim(test))
然后简单地应用一个函数(在这种情况下是第n个根):
n_root = test^(1/test_row_order)