Conditionally rename the value depending on the previous line

I have a df data frame :

Event       Code
Picture     no$
Picture     value
Picture     $
Picture     value
Picture     no$
Picture     value
Picture     no$
Picture     value
Picture     $
Picture     value

I want to rename the value as a reward or no_reward depending on the previous line. If he is $ then rewards, if he is not $, then no_reward

What is the best way to do this?

+4
source share
3 answers

Another idea

df1$Code[c(FALSE, TRUE)] <- ifelse(df1$Code[c(TRUE, FALSE)] == 'no$', 'no_reward', 'reward')
df1
#     Event      Code
#1  Picture       no$
#2  Picture no_reward
#3  Picture         $
#4  Picture    reward
#5  Picture       no$
#6  Picture no_reward
#7  Picture       no$
#8  Picture no_reward
#9  Picture         $
#10 Picture    reward

Note . This suggests that for each $or no$a valuefollows

+4
source

The following is method c ifelse, a subset of and which:

df$Code[which(df$Code=="value")] <- 
       ifelse(df$Code[which(df$Code=="value") - 1] == "$", "reward", "no_reward")

Or perhaps a faster method that doesn't use ifelse:

df$Code[which(df$Code=="value")] <-
      c("reward", "no_reward")[(df$Code[which(df$Code=="value") - 1] == "$") + 1]

Both return

df
     Event      Code
1  Picture       no$
2  Picture no_reward
3  Picture         $
4  Picture    reward
5  Picture       no$
6  Picture no_reward
7  Picture       no$
8  Picture no_reward
9  Picture         $
10 Picture    reward

<strong> data

df <- read.table(header=T, text="Event       Code
Picture     no$
Picture     value
Picture     $
Picture     value
Picture     no$
Picture     value
Picture     no$
Picture     value
Picture     $
Picture     value", as.is=T)
0

data.table data.table::shift :

require(data.table)

dt = data.table(Event = 'Picture',
                Code = c('no$', 'value', '$', 'value', 'no$', 'value', 'no$', 'value', '$', 'value'))

dt[, Code_l1 := shift(Code)]
dt[Code_l1 == '$', Code := 'reward']
dt[Code_l1 == 'no$', Code := 'no_reward']
dt[, Code_l1 := NULL]
0

Source: https://habr.com/ru/post/1649045/


All Articles