如果匹配条件,则将值替换为上一行

Posted

技术标签:

【中文标题】如果匹配条件,则将值替换为上一行【英文标题】: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))

【问题讨论】:

【参考方案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 选项了,已经修改了代码,请检查是否有效。

以上是关于如果匹配条件,则将值替换为上一行的主要内容,如果未能解决你的问题,请参考以下文章

如果行具有匹配的 ID,则将多行中的值合并为一行(单独的单元格)。如果 ID 只存在一次,则为 NULL 值

SQL-如何获取每行的总和并在条件存在时将其放入,如果不存在则将其放入最后一行

如果它是一个函数,则将值推送到 javascript 数组的问题

如果“IN”语句中不存在值,则将值显示为“0”

PHP/SQL - 如果 foreach() 中的 ID 相同,则将值相加

分桶数据,如果桶大小大于 1,则将值设置为 1,否则为 0