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

基于两列时间值比较创建新列时结果异常的问题排查

问题

我想要创建一个trip_pot列,规则为:当fishing_effort_start_date_time列的时间晚于POSITION_DATETIME_NZ列的时间时标记为"travel",否则标记为"potting"。我编写了以下R脚本:

travel_pot <- gpr_df_R %>%
  rowwise() %>% 
  group_by(vessel_name) %>% 
  droplevels() %>% 
  mutate(trip_pot=case_when(fishing_effort_start_date_time > POSITION_DATETIME_NZ 
                            ~"travel", T~"potting"))

travel_pot

脚本成功生成了trip_pot列,但该列的结果存在错误,示例如下:
时间列对比与错误标记示例
请问我的操作哪里出错了?

问题分析与解决

你的脚本存在两个核心问题:

  1. rowwise()与group_by()的顺序错误:先调用rowwise()会触发逐行处理模式,之后的group_by(vessel_name)会覆盖这个模式,两种处理逻辑的冲突会干扰mutate的计算逻辑,导致标记结果异常。
  2. 冗余的droplevels()调用:该函数用于移除因子列的未使用水平,和你创建trip_pot列的逻辑完全无关,反而可能修改数据结构,引发意外问题。

修正后的脚本如下:

travel_pot <- gpr_df_R %>%
  group_by(vessel_name) %>%  # 先按船名完成分组
  mutate(trip_pot = case_when(
    fishing_effort_start_date_time > POSITION_DATETIME_NZ ~ "travel",
    TRUE ~ "potting"
  )) %>%
  ungroup()  # 可选:若后续无需分组,取消分组避免影响其他操作

此外,必须确认两个时间列的数据类型是否为POSIXct/POSIXlt格式:如果其中一列是字符型,时间比较会按照字符排序逻辑执行,必然导致结果错误。可以用以下代码检查数据类型:

class(gpr_df_R$fishing_effort_start_date_time)
class(gpr_df_R$POSITION_DATETIME_NZ)

若不是时间格式,需先用as.POSIXct()转换(根据实际时间格式调整format参数):

gpr_df_R <- gpr_df_R %>%
  mutate(
    fishing_effort_start_date_time = as.POSIXct(fishing_effort_start_date_time, format = "%Y-%m-%d %H:%M:%S"),
    POSITION_DATETIME_NZ = as.POSIXct(POSITION_DATETIME_NZ, format = "%Y-%m-%d %H:%M:%S")
  )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 19:37:01