R 根据上一行有条件地重命名该值

R 根据上一行有条件地重命名该值,r,conditional,rename,R,Conditional,Rename,我有一个数据帧df: Event Code Picture no$ Picture value Picture $ Picture value Picture no$ Picture value Picture no$ Picture value Picture $ Picture value 我想根据前一行将值重命名为“奖励”或“无奖励”。如果是美元,则奖励;如果不是美元,则不奖励 最好的方法是什么

我有一个数据帧df

Event       Code
Picture     no$
Picture     value
Picture     $
Picture     value
Picture     no$
Picture     value
Picture     no$
Picture     value
Picture     $
Picture     value
我想根据前一行将值重命名为“奖励”或“无奖励”。如果是美元,则奖励;如果不是美元,则不奖励


最好的方法是什么

这里是一个使用
ifelse
、子集设置和
的方法,它

df$Code[which(df$Code=="value")] <- 
       ifelse(df$Code[which(df$Code=="value") - 1] == "$", "reward", "no_reward")
两者都返回

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
数据

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)

df您还可以使用
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]
另一个想法

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

df1$code[c(FALSE,TRUE)]它会创建NAs。F和T是什么?假与真?是的,如果你把它保存为df。我在我的环境中把它命名为df1。好的,谢谢。我正在尝试再次运行它,它向我显示了一条错误警告消息:在
[可能是因为我的列中有一些其他变量我不需要处理…它成功了。我只需更改代码:df$code[c(t,F)]
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