'apply'函数中的行/列计数器

时间:2010-03-30 14:13:38

标签: r apply

如果想要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)没有帮助:( 谢谢。

5 个答案:

答案 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)