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

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 重命名为 rewardno_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 [&lt;-.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.tabledata.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]

【讨论】:

以上是关于根据上一行有条件地重命名值的主要内容,如果未能解决你的问题,请参考以下文章

根据 Bash 中的模式重命名目录

XSLT 用属性值重命名元素

键盘输入错误地重定向到命名管道读取

在 Flyway 脚本中安全地重命名 MySQL 表名

如何使用字典键和值重命名 pandas DataFrame 中的列?

递归地重命名字典列表中的字典键