2016-07-25 27 views
4

I ein Datenrahmen df haben:Bedingtes den Wert umbenennen auf der vorherigen Zeile je

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

I Wert zu Belohnung oder no_reward abhängig von der vorherigen Reihe umbenannt werden soll. Wenn es $ dann Belohnung, wenn es Neins $ dann no_reward

Was ist der beste Weg, es zu tun? Hier

Antwort

4

Eine weitere Idee,

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 

Hinweis: Dies setzt voraus, dass jeder für $ oder no$, ein value folgt

+0

erstellt stattdessen NAs. Was sind das F und T? falsch und wahr? – MariKo

+0

Ja. Es sollte funktionieren – Sotos

+0

sollte es nicht df anstelle von DF1 in Ihrem Code sein? – MariKo

0

ist ein Verfahren, mit ifelse, subsetting und which:

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

Oder ein wahrscheinlich schnellere Methode, die nicht ifelse nicht verwendet:

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

Beide geben

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 

Daten

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

Sie auch data.table und data.table::shift dafür verwenden können:

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]