fReezMA
fReezMA

Reputation: 23

How to get value from upcomming row if condition is met?

I searched in google and SO but could not find any answer to my question.

I try to get a value from the first upcomming row if the condition is met.

Example:

Pupil   participation   bonus
  2           55          6
  2           33          3
  2           88          9
  2            0          -100 
  2           44          4
  2           66          7
  2            0          -33

to

Pupil   participation   bonus   bonusAtNoParti   sumBonusTillParticipation=0
  2           55          6          -94                    6+3+9 = 18
  2           33          3          -97                      3+9 = 12
  2           88          9          -91                       9
  2            0          -100        0                        0
  2           44          4          -29                     4+7=11 
  2           66          7          -26                       7
  2            0          -33         0                        0

So I need to do this: Iterate through the dataframe and check next rows till participation equals to 0 and get the bonus from that line and add the bonus from the current line and write it to bonusAtNoPati.

My problem here is the "check next rows till participation equals to 0 and get the bonus from that line" I know how to Iterate through the whole list but not after the current point(row) I would need to do this process to the whole list where i can get any random participation value in random order.

Has anyone any idea how to realize it?

Edit, I also added another column("sumBonusTillParticipation=0", only sum value is required) which is even harder to realize. R is such a hard to learn language =(

Upvotes: 1

Views: 63

Answers (1)

myincas
myincas

Reputation: 1530

you can use which to get which row number participation is 0.

df <- read.table(text = 'Pupil   participation   bonus
             2           55          6
             2           33          3
             2           88          9
             2            0          -100 
             2           44          4
             2           66          7
             2            0          -33', header = T)

index <- c(0, which(df$participation == 0))
diffs <- diff(index)
df$tp <- rep(df$bonus[index], times = diffs)
df$bonusAtNoParti <- df$bonus + df$tp
df$bonusAtNoParti[index] <- 0
df$tp <- NULL

     Pupil participation bonus bonusAtNoParti
 1     2            55     6            -94
 2     2            33     3            -97
 3     2            88     9            -91
 4     2             0  -100              0
 5     2            44     4            -29
 6     2            66     7            -26
 7     2             0   -33              0

Upvotes: 1

Related Questions