Счетчик строк/столбцов в функциях "применить"

Что делать, если нужно 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 <- matrix(c(26,21,20,34,29,28),nrow=3), rownames (test) не помогает:( Спасибо.

Ответ 1

Обычно я выполняю sapply для номеров строк 1:nrow(test) вместо test и использую test[i,] внутри функции:

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

Я не уверен, что это действительно эффективно.

Ответ 2

Если вы даете функции имя, а не анонимно, вы можете легко передавать аргументы. Мы можем использовать nrow, чтобы получить количество строк и передать вектор чисел строк в качестве параметра вместе с кадром, который будет индексироваться таким образом.

Для ясности я использовал другую примерную функцию; этот пример умножает столбец x на столбец y для матрицы из двух столбцов:

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)

Ответ 3

Собственно, в случае с матрицей вам даже не нужно apply. Просто:

test^(1/row(test))

делает то, что вы хотите, я думаю. Я думаю, что функция row() - это то, что вы ищете.

Ответ 4

cbind() Число строк кажется довольно простым. Для матрицы (или кадра данных) должно работать следующее:

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

или все, что вы хотите построить.

Ответ 5

Я немного запутался, поэтому извините меня, если я ошибаюсь, но вы хотите выработать n-й корень из чисел в каждой строке матрицы, где n = номер строки. Если это так, то его действительно просто создать новый массив с теми же размерами, что и оригинал, причем каждый столбец имеет те же значения, что и соответствующий номер строки:

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

Затем просто примените функцию (в этом случае n-й корень):

n_root = test^(1/test_row_order)