Счетчик строк / столбцов в функциях применения - PullRequest
28 голосов
/ 30 марта 2010

Что, если кто-то хочет 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), имена строк (test) не помогают :( Спасибо.

Ответы [ 5 ]

31 голосов
/ 30 марта 2010

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

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

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

3 голосов
/ 23 января 2015

Если вы даете функции имя, а не делаете его анонимным, вы можете передавать аргументы проще.Мы можем использовать 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 голосов
/ 01 апреля 2010

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

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

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

2 голосов
/ 31 марта 2010

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

test^(1/row(test))

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

0 голосов
/ 23 марта 2015

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

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

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

n_root = test^(1/test_row_order)
...