30

如果一个人想要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])))

PS 实际上,如果test真的是一个矩阵 : test <- matrix(c(26,21,20,34,29,28),nrow=3) , rownames(test) 没有帮助 :( 谢谢。

4

5 回答 5

34

我通常做的是sapply在行号上运行,1:nrow(test)而不是在函数内部test使用test[i,]

t(sapply(1:nrow(test), function(i) test[i,]^(1/i)))

不过,我不确定这是否真的有效。

于 2010-03-30T15:00:27.270 回答
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)
于 2015-01-23T02:15:12.957 回答
2

实际上,在矩阵的情况下,您甚至不需要apply. 只是:

test^(1/row(test))

做你想做的,我想。我认为该row()功能是您正在寻找的东西。

于 2010-03-31T15:27:11.227 回答
2

cbind()设置行号似乎是一种非常简单的方法。对于矩阵(或数据框),以下应该有效:

apply( cbind(1:(dim(test)[1]), test), 1, function(x) plot(x[-1], main=x[1]) )

或任何你想绘制的东西。

于 2010-04-01T05:31:05.717 回答
0

I'm a little confuse so excuse me if I get this wrong but you want work out n-th root of the numbers in each row of a matrix where n = the row number. If this this the case then its really simple create a new array with the same dimensions as the original with each column having the same values as the corresponding row number:

test_row_order = array(seq(1:length(test[,1]), dim = dim(test))

Then simply apply a function (the n-th root in this case):

n_root = test^(1/test_row_order)
于 2015-03-23T20:28:31.343 回答