Отслеживание текущего индекса при использовании
Хотел посмотреть, есть ли у кого-то более элегантное решение. Но каков подходящий способ отслеживания текущего индекса при использовании. Например, предположим, что я хотел взять ТОЛЬКО ТОЛЬКО из текущего элемента, который я оцениваю, идущего в конец моего вектора.
Это лучший способ сделать это?
y = rep(1,100)
apply(as.matrix(seq(1:length(y))),1,function(x) { sum(y[x:length(y)])})
Я ценю ваш вклад.
Ответы
Ответ 1
Это больше похоже на задачу для sapply
:
sapply(seq_along(y), function(x){sum(y[x:length(y)])})
В вашем конкретном примере есть множество других параметров (например, изменение вектора y
, а затем использование cumsum
), но я предполагаю, что это общий шаблон:
используйте seq_along
или в худшем случае seq
, чтобы получить интересующую вас последовательность, и передайте ее на *apply
.
Ответ 2
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
Ответ 3
Ну, пример может быть несколько неудачным, но вопрос о том, как узнать об индексе, находящемся в функции "apply" или "sapply", остается без ответа.
То, что вы можете посмотреть, это
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 в применении или применении. Лучшие идеи приветствуются.
Ответ 4
Этот ответ еще не получил удовлетворительного ответа. Глобальная переменная работает так, как запрашивается smoe, но она не выглядит быстрее, чем цикл for, см. пример ниже.
df=data.frame(a=1:100000,b=1:100000,y=rep(NA,100000))
ind=1
system.time(sapply(df$a,function(x){
df$y[ind]<<-x+df$b[ind]
ind<<-ind+1
}))
system.time(for(i in 1:nrow(df)){
df$y[i]=df$a[i]+df$b[i]
})