Dplyr中mutate基于日期列条件取值异常问题排查
问题分析与解决
问题原因
你在mutate中使用的values[dates==yoy]逻辑有误:这里的dates和yoy都是整列向量,dates==yoy会做逐元素的列级比较,最终得到的逻辑向量只有第一行是TRUE(仅2010-01-01的dates等于自身yoy),因此只会取出values的第一个元素2。而dplyr会自动将这个长度为1的向量循环填充到所有行,导致所有yoyval都显示为2,完全不符合逐行匹配上一年数值的需求。
正确解决方法
方法1:使用match函数实现逐行匹配
match函数可以为每个yoy值找到它在dates列中的对应索引,再用这个索引提取对应的values:
final <- dataset_calc %>% mutate(yoyval = values[match(yoy, dates)])
方法2:使用左连接(逻辑更直观)
把原数据集作为匹配表,通过yoy与dates的对应关系做左连接,直接关联出目标数值:
final <- dataset_calc %>% left_join(dataset %>% select(dates, yoyval = values), by = c("yoy" = "dates"))
验证结果
两种方法都会得到你预期的输出:
names values dates yoy yoyval <chr> <dbl> <date> <date> <dbl> 1 a 2 2010-01-01 2010-01-01 2 2 a 3 2011-01-01 2010-01-01 2 3 a 4 2012-01-01 2011-01-01 3 4 a 5 2013-01-01 2012-01-01 4 5 a 6 2014-01-01 2013-01-01 5 6 a 7 2015-01-01 2014-01-01 6
内容的提问来源于stack exchange,提问作者Modern_ibex
相关产品推荐
相关产品推荐

