Reputation: 1295
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
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
Reputation: 887981
We can use ifelse
x %>%
mutate(newcol = ifelse(X2==1, lag(X1), 0))
Upvotes: 12