【问题标题】: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

最好的方法是什么?

【问题讨论】:

    标签: r conditional rename


    【解决方案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]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-21
        • 2014-10-25
        • 2021-04-23
        • 1970-01-01
        • 2019-09-30
        • 1970-01-01
        • 2020-01-15
        • 1970-01-01
        相关资源
        最近更新 更多