R векторное вычитание, векторизованная альтернатива циклу for

#r #for-loop #vectorization

#r #для цикла #векторизация

Вопрос:

 Leaves<- c(2,4,6,7,8,10,11,15)
ax<- c(2,1,1,2,3,1,1,1)
bx <- c(0,0,0,0,2,0,0,1) 
mydata<- data.frame(Leaves, ax, bx)
Sx<- c()
Sx[1] <- sum(x$ax)
for(i in 2:length(mydata$Leaves)){     
  Sx[i] <- Sx[i-1] - mydata$ax[i-1]
}
 

Здесь происходит то, что я хочу, чтобы первое значение для столбца Sx было суммой столбца ax. Второе значение Sx должно быть Sx [1]-ax [1], третье значение Sx должно быть Sx [2]-ax[2 и так далее.

Этот код работает прямо сейчас, но это цикл for. Кто-нибудь знает способ создать векторизованную альтернативу этому циклу for? Я много изучал функции Dplyr lag и data.table shift, но я не уверен, как заставить их работать.

Ответ №1:

Векторным способом было бы :

 mydata$Sx <- sum(mydata$ax) - cumsum(mydata$ax)   mydata$ax
mydata

#  Leaves ax bx Sx
#1      2  2  0 12
#2      4  1  0 10
#3      6  1  0  9
#4      7  2  0  8
#5      8  3  2  6
#6     10  1  0  3
#7     11  1  0  2
#8     15  1  1  1
 

Комментарии:

1. Вы сделали это простым, спасибо вам большое!