使用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
此前使用全部观测数据时计算正常,但不符合当前研究需求。
问题原因排查与解决方案
核心原因推测
- 日期类型不统一:
observations的date列是Date类型,但ot和pres的date列是字符(chr)类型。函数内部处理日期时,可能因类型不兼容导致字符型日期被错误解析,或在数据合并时生成超长字符串。 - 异常日期值:
ot或pres的date列中存在非标准格式的超长字符串(如非YYYY-MM-DD格式、空值或拼接后的长文本),触发strptime解析错误。 - 筛选逻辑导致的数据异常:当设置
limit2focalnonfocal = T时,函数会筛选焦点与非焦点的配对数据,若筛选后的数据合并过程中,date列被错误拼接(如将多个日期值合并为单个长字符串),也会引发该错误。
解决方案
- 统一所有数据框的日期类型:将
ot和pres的date列转换为Date类型:
ot$date <- as.Date(ot$date) pres$date <- as.Date(pres$date)
- 检查并清理异常日期值:排查
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), ]
- 分步筛选数据后再运行函数:先手动筛选出焦点个体的观测数据,再传入
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
相关产品推荐
相关产品推荐

