You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于其他列与日期条件创建新列的技术问题求助

问题分析

你的代码存在三个核心问题:

  1. 循环覆盖结果:每次循环都重新赋值new_data,最终只保留了最后一次循环(i=4)的结果,前面的逻辑全部被覆盖。
  2. 逻辑不符合需求:你试图通过循环逐个判断列,但需求是当当前行日期小于上一行时切换到下一个城市列,否则保持当前列,需要跟踪累积的切换状态,而非单次判断。
  3. 列索引越界:当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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 11:27:28