【问题标题】:Replace value with previous row if match the condition如果匹配条件,则将值替换为上一行
【发布时间】:2021-04-15 17:01:21
【问题描述】:

我有一个数据框:

df=data.frame('Id'=c(101,101,102,102,103,103,104,104),'values'=c('a','b','a','c','a','d','a','c'))

如果有任何值 b 我想过滤,那么它应该被它的前一行值替换。

我已经尝试过这段代码,但它不起作用。

df%>%
  group_by(Id)%>%
  filter('b' %in% values)%>%
  mutate(values=lag(values))

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    您是否正在寻找这个,但如果第一个值是'b',那么第一行将有lag 的 NA,您可以相应地调整默认值:

    df%>%
       group_by(Id)%>%
         mutate(values = case_when(values == 'b' ~ lag(values, default = 'z'),
                                 TRUE ~ values))
    # A tibble: 8 x 2
    # Groups:   Id [4]
         Id values
      <dbl> <chr> 
    1   101 a     
    2   101 a     
    3   102 a     
    4   102 c     
    5   103 a     
    6   103 d     
    7   104 a     
    8   104 c     
    

    【讨论】:

    • 第一个值永远不会是'b',这只是输出值改变的Id,我想在数据框中改变它,其他值应该相同
    • @Nishant,那你就不需要filter 选项了,已经修改了代码,请检查是否有效。
    猜你喜欢
    • 2018-02-24
    • 2021-03-15
    • 2021-11-18
    • 2018-10-23
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 2015-02-14
    • 2020-12-01
    相关资源
    最近更新 更多