Lee88
Lee88

Reputation: 1295

How to use values from a previous row and column

I am trying to create a new variable which is a function of previous rows and columns. I have found the lag() function in dplyr but it can't accomplish exactly what I would like.

library(dplyr)
set.seed(0)

x <- data.frame(replicate(2, sample(1:3,10,rep=TRUE)))

   X1 X2
1   2  3
2   1  3
3   3  1
4   1  1
5   2  1
6   1  2
7   3  2
8   3  2
9   2  2
10  2  3

x <- mutate(x, new_col = # if x2==1, then the value of x1 in the previous row,
                        # if x2!=1, then 0))

My best attempt:

foo <- function(x) {
    if (x == 1){
        return(lag(X1))
    } else {
        return(0)
}

x <- mutate(x, new_col = foo(X1))

Upvotes: 9

Views: 13421

Answers (2)

lmo
lmo

Reputation: 38520

In base R, you can use

x$newcol <- (x$X2 == 1) * c(NA, tail(x$X1, -1))

(x$X2 == 1) ensures 0s for all elements of X2 not equal to 1, and the multiple of the two terms will return the lagged values of X1 when X2 == 1.

Upvotes: 5

akrun
akrun

Reputation: 887981

We can use ifelse

x %>% 
  mutate(newcol = ifelse(X2==1, lag(X1), 0))

Upvotes: 12

Related Questions