如果匹配条件,则将值替换为上一行
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 数组的问题