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

R语言:基于ProjectCameraID列对百万行数据集日期列加减年份

问题解决方案

错误原因

普通if语句只能处理长度为1的判断条件,但dep$ProjectCameraID == "OG2"会生成一个和数据集行数一致的布尔向量(百万行数据就是百万个TRUE/FALSE),这直接触发了the condition has length > 1错误。另外你代码里还存在对象名不一致的问题(一会用df一会用dep),得先统一。

解决方案

方法1:基础R的ifelse函数(向量化判断)

ifelse是专门处理向量条件的函数,效率适配百万级数据量:

# 先统一对象名,假设你的数据集是df
library(lubridate) # 加载years()函数所在的包

df$deploy_start <- ifelse(df$ProjectCameraID == "OG2", 
                          df$deploy_start + years(1), 
                          df$deploy_start)
df$deploy_end <- ifelse(df$ProjectCameraID == "OG2", 
                        df$deploy_end + years(1), 
                        df$deploy_end)

注:你的日期列已经是Date类型,不需要额外用ymd()转换。

方法2:tidyverse的case_when(多条件场景更灵活)

如果后续要给多个ProjectCameraID设置不同年份调整规则,用dplyr的case_when可读性更强,同样适配百万行数据:

library(dplyr)
library(lubridate)

df <- df %>%
  mutate(
    deploy_start = case_when(
      ProjectCameraID == "OG2" ~ deploy_start + years(1),
      # 可扩展其他规则,比如给OG3的日期减1年
      # ProjectCameraID == "OG3" ~ deploy_start - years(1),
      TRUE ~ deploy_start  # 其他情况保持原日期
    ),
    deploy_end = case_when(
      ProjectCameraID == "OG2" ~ deploy_end + years(1),
      TRUE ~ deploy_end
    )
  )

方法3:分组批量修改(同ID行较多时适用)

如果同一个ProjectCameraID包含大量行,可先分组再修改:

library(dplyr)
library(lubridate)

df <- df %>%
  group_by(ProjectCameraID) %>%
  mutate(
    deploy_start = if(cur_group()$ProjectCameraID == "OG2") deploy_start + years(1) else deploy_start,
    deploy_end = if(cur_group()$ProjectCameraID == "OG2") deploy_end + years(1) else deploy_end
  ) %>%
  ungroup()

验证结果

运行上述代码后,示例数据的输出如下:

print(df)
#   deploy_start deploy_end ProjectCameraID
# 1   2023-05-15 2023-09-15             OG1
# 2   2023-05-20 2023-09-20             OG2  # 年份已成功加1
# 3   2024-05-10 2024-09-10             OG3

内容的提问来源于stack exchange,提问作者YGRainForest

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 12:22:33