根据上一行有条件地重命名值
Posted
技术标签:
【中文标题】根据上一行有条件地重命名值【英文标题】:Conditionally rename the value depending on the previous row 【发布时间】:2016-11-28 23:13:45 【问题描述】:我有一个数据框df:
Event Code
Picture no$
Picture value
Picture $
Picture value
Picture no$
Picture value
Picture no$
Picture value
Picture $
Picture value
我想根据上一行将 value 重命名为 reward 或 no_reward。如果是 $ 则 reward,如果是 no$ 则 no_reward
最好的方法是什么?
【问题讨论】:
【参考方案1】:另一个想法,
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
注意:这假设对于每个$
或no$
,一个value
跟随
【讨论】:
它会创建 NA。 F和T是什么?真假? 嗯,是的......如果你把它保存为df。我在我的环境中将其命名为 df1。 好的,谢谢。我正在尝试再次运行它并显示此错误警告消息:In[<-.factor
(*tmp*
, c(F, T), value = c(31L, NA, 25L, NA, 22L, : invalid factor level , NA 生成
可能是因为我的专栏中有一些其他变量不需要处理...
成功了。只有我必须更改代码: df$Code[c(T, F)]
【参考方案2】:
这是一个带有ifelse
、子集和which
的方法:
df$Code[which(df$Code=="value")] <-
ifelse(df$Code[which(df$Code=="value") - 1] == "$", "reward", "no_reward")
或者不使用ifelse
的可能更快的方法:
df$Code[which(df$Code=="value")] <-
c("reward", "no_reward")[(df$Code[which(df$Code=="value") - 1] == "$") + 1]
都返回
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)
【讨论】:
【参考方案3】:您也可以为此使用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]
【讨论】:
以上是关于根据上一行有条件地重命名值的主要内容,如果未能解决你的问题,请参考以下文章