R 根据上一行有条件地重命名该值
我有一个数据帧df: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 我想根据前一行将值重命名为“奖励”或“无奖励”。如果是美元,则奖励;如果不是美元,则不奖励 最好的方法是什么
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