Отслеживание текущего индекса при использовании apply - PullRequest
11 голосов
/ 12 октября 2011

Хотел посмотреть, есть ли у кого-нибудь более изящное решение. Но как правильно отслеживать текущий индекс при использовании apply? Например, предположим, что я хотел взять сумму ТОЛЬКО из текущего элемента, который я оцениваю, и перейти к концу моего вектора.

Это лучший способ сделать это?

y = rep(1,100)
apply(as.matrix(seq(1:length(y))),1,function(x) { sum(y[x:length(y)])})

Я ценю ваш вклад.

Ответы [ 3 ]

9 голосов
/ 12 октября 2011

Это больше похоже на задачу для sapply:

sapply(seq_along(y), function(x){sum(y[x:length(y)])})

Для вашего конкретного примера есть множество других опций (например, реверсирование вектора y и затем использование cumsum),но я предполагаю, что это общий шаблон: используйте seq_along или в худшем случае seq, чтобы получить интересующую вас последовательность, и передайте ее *apply.

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

Что ж, пример, возможно, был несколько неудачным, но вопрос о том, как узнать об индексе в функции «apply» или «sapply», остается без ответа.

Что-то, на что вы, возможно, захотите взглянутьis

x <- 0
l <- 1:10; names(l) <- letters[l]
sapply(l,function(Y) {
   x <<- x+1
   a<-sum(x:length(l))
   cat("I am at ",names(l)[x]," valued ",a,".\n",sep="")
   return(a)
})

Я также недоволен, несмотря на трюк "<< -" для ссылки на внешние переменные (спасибо, Стефан).Особенно при параллельной работе вы хотите, чтобы семантика как-то четко выражалась, которая запрашивает индекс или позицию x / y в sapply или apply.Лучшие идеи приветствуются. </p>

3 голосов
/ 12 октября 2011

rev(cumsum(y)) будет намного быстрее в текущем случае:

> y = rep(1,100000)
> system.time(apply(as.matrix(seq(1:length(y))),1,function(x) { sum(y[x:length(y)])}) )
   user  system elapsed 
 88.108  88.639 176.094 
> system.time( rev(cumsum(y)) )
   user  system elapsed 
  0.002   0.001   0.004 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...