来自 adehabitatLT::as.ltraj() 的错误,因为日期不是类 POSIXct,但 str(dates) 表示它们是 POSIXct

Error from adehabitatLT::as.ltraj() because dates are not class POSIXct but str(dates) indicates they are POSIXct

提问人:Kevin 提问时间:8/29/2023 更新时间:8/29/2023 访问量:34

问:

adehabitatLR::as.ltraj() 函数计算动物的轨迹。该函数要求日期为类 POSIXct。我使用我在网上找到的播放数据集,在帮助文档的示例部分中执行了相同的步骤,并将日期时间转换为 POSIXct 日期,但在运行该函数时仍然出现以下错误

adehabitatLT::as.ltraj(xy = xy[id == “17”, ], date = date[id == : 对于类型为 II 的对象,日期应为类 “POSIXct”

这是我正在做的事情......

library(tidyverse)
library(lubridate)
library(rio)
library(sp)
library(adehabitatLT)

#import elk collar data
data<-import("https://www.sciencebase.gov/catalog/file/get/59d90ceee4b05fe04cc9b0f2?f=__disk__a8%2F84%2Fa6%2Fa884a68596e8ed85b6b956119db0f1fffc4e960c")
glimpse(data)
#following example: convert date-time to posixct, and ID to character
elk<-data%>%mutate(date=as.POSIXct(strptime(Date_Time_MST,"%m/%d/%Y",tz="US/Mountain")))%>%mutate(AID=as.character(AID))
#get id vector
id<-elk%>%dplyr::select(AID)
#get xy data
xy<-elk%>%dplyr::select(Easting, Northing)%>%coordinates()%>%as.data.frame()
#get dates
date<-elk%>%dplyr::select(date)%>%as.data.frame()
str(date)
#get trajectories for AID 17
tr<-adehabitatLT::as.ltraj(xy=xy[id=="17",],date=date[id=="17"], id="17")
R posixct adehabitathr

评论

0赞 r2evans 8/29/2023
你是一个数据帧,不要把一列的帧误认为是类的向量,它们不等价。我不知道你为什么要把东西从你的框架中打破,我可能会做一些类似的事情(或类似的事情......我也没有那个包,但前提应该有效)。datePOSIXctPOSIXcttr <- with(elk[elk$id=="17",], as.ltraj(xy=xy, date=date, id="17"))

答:

1赞 r2evans 8/29/2023 #1

你的对象不是类的,它是一个 .不要将具有一列的帧(恰好是)等效的函数误认为是向量。datePOSIXctdata.framePOSIXctPOSIXct

此外,我认为没有理由将其分解为单独的向量,这为不一致的索引等留下了空间。我建议这样:

elk <- data %>%
  mutate(date = as.POSIXct(Date_Time_MST, format = "%m/%d/%Y", tz  ="US/Mountain"))) %>%
  mutate(AID = as.character(AID))

tr <- with(elk[elk$AID == "17",],
           as.ltraj(xy = coordinates(cbind(Easting, Northing), date = date, id = AID))

如果您要对多个(甚至所有)进行一次调用,并希望将其自动化,则可以生成一个列表列(保存以供以后使用),其内容如下:idelk

elk_with_tr <- elk %>%
  filter(id %in% c("17", ...)) %>%        # some other IDs of interest to you
  mutate(
    tr = Map(as.ltraj, xy=coordinates(cbind(Easting, Northing)), date=date, id=AID)
  )

这个新框架将有一个以所有结果命名的 -列。listtr

评论

1赞 Kevin 8/29/2023
谢谢,这很有帮助。我最终遇到了其他错误(例如,xy 在麋鹿中不存在),但最终我想我解决了它......麋鹿1<-麋鹿%>% dplyr::select(AID,Easting, Northing, date)%>% distinct()%>% nest(data=-AID)%>% mutate(traj=map2(AID,data,~as.ltraj(xy=data.frame(x=.y$Easting, y=.y$Northing),date=.y$date,id=.x)))
1赞 r2evans 8/29/2023
哎呀,对了,你是两列,我赶紧过来,做错了......为清楚起见进行编辑,对此感到抱歉......xy