Предположим, у меня есть вектор v
и я хотел бы создать другой вектор p
такой же длины, который кодирует суммарный вес позиции каждой позиции в v
(и 0 вместо 0 в v
). Например, для v = c(0,1,3,0,1) я получаю p = c(0, 2, 11, 0, 16). Другими словами, i-й элемент в p
(то есть не 0) становится v[i]*i плюс предыдущий элемент в p
(то есть не 0).
Я придумал метод, но он кажется уродливым, и я боюсь, что он не очень эффективен по времени/памяти - мне нужно сделать это на огромных векторах. Есть идеи по улучшению?
fun <- function(v){
res <- NULL
s = 0
for(i in 1:length(v)){
ifelse(v[i] == 0, res[i] <- 0, {res[i] <- v[i]*i + s; s <- res[i]})
}
return(res)
}
А потом:
> fun(c(0,1,3,0,1))
[1] 0 2 11 0 16
ОБНОВЛЕНИЕ:
Как изменить вывод этой функции, т.е. вернуться к c(0,1,3,0,1) из c(0,2,11,0,16)?
*+(!!v)
? 11.02.2016as.integer(as.logical(v))
11.02.2016