如何用lag值条件更新DataFrame中RAIN列的值?
问题:DataFrame中RAIN列的递推更新需求
需求说明
需要更新DataFrame的RAIN列,规则为:若当前行的RAIN值小于上一行的RAIN值,则将其替换为上一行的RAIN值。
样本DataFrame
TRGCODE gr DATE TIME RAIN 12 24 2017-03-15 1645 00 12 24 2017-03-15 1700 00 12 24 2017-03-15 1715 0.5 12 24 2017-03-15 1730 00 12 24 2017-03-15 1745 0.5 12 24 2017-03-15 1800 0.5 12 24 2017-03-15 1815 00 12 24 2017-03-15 1830 00 12 24 2017-03-15 1845 0.5 12 24 2017-03-15 1900 00 12 24 2017-03-15 1915 00 12 24 2017-03-15 1930 0.5 12 24 2017-03-15 1945 0.5
尝试的代码及问题
使用以下代码后,仅修改了1730、1815、1900时间点的RAIN值,1830和1915的未被修改,未达到预期效果:
df <- df %>% group_by(TRGCODE, gr) %>% dplyr::mutate(RAIN = ifelse(RAIN < lag(RAIN, default = first(RAIN)), lag(RAIN), RAIN))
期望输出
TRGCODE gr DATE TIME RAIN 12 24 2017-03-15 1645 00 12 24 2017-03-15 1700 00 12 24 2017-03-15 1715 0.5 12 24 2017-03-15 1730 0.5 12 24 2017-03-15 1745 0.5 12 24 2017-03-15 1800 0.5 12 24 2017-03-15 1815 0.5 12 24 2017-03-15 1830 0.5 12 24 2017-03-15 1845 0.5 12 24 2017-03-15 1900 0.5 12 24 2017-03-15 1915 0.5 12 24 2017-03-15 1930 0.5 12 24 2017-03-15 1945 0.5
原因分析
原代码中lag(RAIN)调用的是原始RAIN列的上一行值,而非更新后的值。比如1815行被修改为0.5后,1830行判断时,lag(RAIN)仍然是原始的00,因此00不小于00,不会触发替换逻辑。
解决方案
使用purrr::accumulate实现递推更新,每一步判断都基于前一行更新后的RAIN值:
library(dplyr) library(purrr) df <- df %>% group_by(TRGCODE, gr) %>% mutate(RAIN = accumulate(RAIN, ~ifelse(.y < .x, .x, .y))) %>% ungroup()
代码说明
accumulate函数会遍历RAIN列,.x代表前一个元素(已更新后的值),.y代表当前元素- 每次判断当前元素
.y是否小于前一个元素.x,若是则用.x替换.y,否则保留.y - 分组内的递推逻辑保证了每个组独立处理,符合需求
内容的提问来源于stack exchange,提问作者Ajay
相关产品推荐
相关产品推荐

