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

使用socialindices包计算雌雄配对DSI时遇strptime错误求助

使用socialindices包计算DSI得分时的strptime错误排查

场景与数据结构

我尝试用Christof Neumann开发的socialindices包计算雌雄配对的DSI得分,涉及三个数据框:

  • 行为观测数据框(observations):
> str(observations)
tibble [476 × 6] (S3: tbl_df/tbl/data.frame)
 $ date    : Date[1:476], format: "2022-10-20" "2022-10-14" "2022-10-14" "2022-09-20" ...
 $ focal   : chr [1:476] "Sho" "Sho" "Sho" "Buk" ...
 $ actor   : chr [1:476] "Ginq" "Sho" "Ndaw" "Ginq" ...
 $ receiver: chr [1:476] "Sho" "Ndaw" "Sho" "Buk" ...
 $ beh     : chr [1:476] "Approach" "Approach" "Groom.focal" "Contact.focal" ...
 $ dur     : int [1:476] NA NA 128 661 223 899 434 NA 19 NA ...
  • 观测时间数据框(ot):
> str(ot)
'data.frame':   209 obs. of  3 variables:
 $ focal: chr  "Buk" "Buk" "Buk" "Buk" ...
 $ date : chr  "2022-06-07" "2022-06-11" "2022-06-15" "2022-06-17" ...
 $ OT   : int  1204 1212 1212 1200 1200 1202 1205 635 1204 963 ...
  • 在场情况数据框(pres):
> str(pres)
'data.frame':   374 obs. of  5 variables:
 $ date: chr  "2022-01-03" "2022-01-04" "2022-01-05" "2022-01-06" ...
 $ Buk : int  1 1 1 0 1 1 1 1 1 1 ...
 $ Ginq: int  1 1 1 1 1 1 1 1 1 1 ...
 $ Ndaw: int  1 1 1 1 1 1 1 1 1 1 ...
 $ Sho : int  1 1 1 1 1 1 1 1 1 1 ...

研究目标是分析雌雄关系随时间的变化,指定雄性个体Buk和Sho为焦点,每个焦点对应3个潜在配对对象。

运行代码与错误

执行以下代码时持续报错:

scores <- DSI(observations, ot.source = ot, presence = pres, onlyfocaldyads = F, limit2focalnonfocal = T, duration.NA.treatm = "count")

错误信息:

Error in strptime(xx, ff, tz = "GMT") : input string is too long

此前使用全部观测数据时计算正常,但不符合当前研究需求。

问题原因排查与解决方案

核心原因推测

  1. 日期类型不统一:observations的date列是Date类型,但ot和pres的date列是字符(chr)类型。函数内部处理日期时,可能因类型不兼容导致字符型日期被错误解析,或在数据合并时生成超长字符串。
  2. 异常日期值:ot或pres的date列中存在非标准格式的超长字符串(如非YYYY-MM-DD格式、空值或拼接后的长文本),触发strptime解析错误。
  3. 筛选逻辑导致的数据异常:当设置limit2focalnonfocal = T时,函数会筛选焦点与非焦点的配对数据,若筛选后的数据合并过程中,date列被错误拼接(如将多个日期值合并为单个长字符串),也会引发该错误。

解决方案

  1. 统一所有数据框的日期类型:将ot和pres的date列转换为Date类型:
ot$date <- as.Date(ot$date)
pres$date <- as.Date(pres$date)
  1. 检查并清理异常日期值:排查ot和pres的date列,删除或修正超长/非标准格式的日期:
# 检查日期字符串长度(标准YYYY-MM-DD为10位)
nchar(ot$date)
nchar(pres$date)
# 筛选出异常行
ot[which(nchar(ot$date) != 10), ]
pres[which(nchar(pres$date) != 10), ]
  1. 分步筛选数据后再运行函数:先手动筛选出焦点个体的观测数据,再传入DSI函数,避免函数内部筛选逻辑引发的问题:
# 筛选焦点为Buk或Sho的观测数据
obs_focal <- observations[observations$focal %in% c("Buk", "Sho"), ]
# 运行DSI
scores <- DSI(obs_focal, ot.source = ot, presence = pres, onlyfocaldyads = F, limit2focalnonfocal = T, duration.NA.treatm = "count")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 04:43:18