基于两列时间值比较创建新列时结果异常的问题排查
问题
我想要创建一个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列,但该列的结果存在错误,示例如下:
请问我的操作哪里出错了?
问题分析与解决
你的脚本存在两个核心问题:
rowwise()与group_by()的顺序错误:先调用rowwise()会触发逐行处理模式,之后的group_by(vessel_name)会覆盖这个模式,两种处理逻辑的冲突会干扰mutate的计算逻辑,导致标记结果异常。- 冗余的
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
相关产品推荐
相关产品推荐

