基于其他列与日期条件创建新列的技术问题求助
问题分析
你的代码存在三个核心问题:
- 循环覆盖结果:每次循环都重新赋值
new_data,最终只保留了最后一次循环(i=4)的结果,前面的逻辑全部被覆盖。 - 逻辑不符合需求:你试图通过循环逐个判断列,但需求是当当前行日期小于上一行时切换到下一个城市列,否则保持当前列,需要跟踪累积的切换状态,而非单次判断。
- 列索引越界:当
i=4时,data[,i+1]对应第5列,原始数据不存在该列,导致部分结果异常。
解决方案
我们可以用dplyr结合purrr::accumulate来跟踪城市组的切换状态,精准实现需求:
首先加载依赖包:
library(dplyr) library(purrr)
处理数据:
# 假设你的原始数据框名为data data <- data %>% # 转换date列为标准日期类型 mutate(date = as.Date(date)) %>% # 用accumulate跟踪城市组:初始为1(对应city1),日期小于上一行时组号+1 mutate(city_group = accumulate(2:n(), .init = 1, ~ ifelse(date[.] < date[.x], .x + 1, .x))) %>% # 根据组号匹配对应城市列 mutate(NewColumn = case_when( city_group == 1 ~ city1, city_group == 2 ~ city2, city_group == 3 ~ city3 )) %>% # 移除中间辅助列(可选) select(-city_group)
结果验证
运行后得到的结果与你的期望输出完全一致:
date city1 city2 city3 NewColumn 2022-01-25 Paris London Berlin Paris 2022-01-28 Paris London Berlin Paris 2022-02-04 Paris London Berlin Paris 2022-01-26 Paris London Berlin London 2022-02-08 Paris London Berlin London 2022-02-02 Paris London Berlin Berlin 2022-02-04 Paris London Berlin Berlin 2022-02-06 Paris London Berlin Berlin
内容的提问来源于stack exchange,提问作者Kalle Blomkvist
相关产品推荐
相关产品推荐

