1

我正在尝试将SPLUS带有类的数据转换为带有timeSpan类的R数据POSIXlt。我查看了lubridate包装,但找不到解决方法。R无法检测到timeSpan类,因此当我尝试使用数据创建变量时它会吐出错误。

lubridate帮助文件?'lubridate-package'

Lubridate 区分时间点(称为瞬间)和时间跨度(称为时间跨度,请参阅时间跨度类)。时间跨度进一步分为 Duration-class、Period-class 和 Interval-class 对象。

我也从包开发人员写的这篇文章中寻求帮助lubridate,但找不到解决方法。是否可以将timeSpan类转换SPLUSposixltR

SPLUS 数据:

"span" = new("timeSpan", .Data = list(c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 7,
    7, 30, 30, 91, 91, 365, 1826, 9131, 36525),
    c(1, 1, 2, 5, 10, 25, 50, 100, 250, 500, 1000, 5000, 15000, 60000, 60000, 
    300000, 300000, 900000, 900000, 3600000, 10800000, 10800000, 21600000,
    0, 0, 0, 37800000, 37800000, 27000000, 27000000, 21600000, 21600000,
    21600000, 0)),
   .Data.names = c("julian.day", "milliseconds"),
   .Data.classes = new("CLASS",c("integer", "integer")),
   format = "%dd %Hh %Mm %Ss %NMS")

在 SPLUS 工作台上评估后的数据外观:

span
 [1] 0d 0h 0m 0s 1MS     0d 0h 0m 0s 1MS     0d 0h 0m 0s 2MS    
 [4] 0d 0h 0m 0s 5MS     0d 0h 0m 0s 10MS    0d 0h 0m 0s 25MS   
 [7] 0d 0h 0m 0s 50MS    0d 0h 0m 0s 100MS   0d 0h 0m 0s 250MS  
[10] 0d 0h 0m 0s 500MS   0d 0h 0m 1s 0MS     0d 0h 0m 5s 0MS    
[13] 0d 0h 0m 15s 0MS    0d 0h 1m 0s 0MS     0d 0h 1m 0s 0MS    
[16] 0d 0h 5m 0s 0MS     0d 0h 5m 0s 0MS     0d 0h 15m 0s 0MS   
[19] 0d 0h 15m 0s 0MS    0d 1h 0m 0s 0MS     0d 3h 0m 0s 0MS    
[22] 0d 3h 0m 0s 0MS     0d 6h 0m 0s 0MS     1d 0h 0m 0s 0MS    
[25] 7d 0h 0m 0s 0MS     7d 0h 0m 0s 0MS     30d 10h 30m 0s 0MS 
[28] 30d 10h 30m 0s 0MS  91d 7h 30m 0s 0MS   91d 7h 30m 0s 0MS  
[31] 365d 6h 0m 0s 0MS   1826d 6h 0m 0s 0MS  9131d 6h 0m 0s 0MS 
[34] 36525d 0h 0m 0s 0MS

R控制台上的错误:

Error in getClass(Class, where = topenv(parent.frame())) : 
  “timeSpan” is not a defined class
4

1 回答 1

1

从 S 对象中取出核心list .Data对象,然后可以将其操作为 R difftime,然后可以从POSIXct/ltorDate对象中添加/减去:

out <- Reduce(`+`,
         Map(as.difftime, Map(`/`, x, c(1,1000)), units=list("days","secs"))
       )
units(out) <- "days"

round(out,4)
#Time differences in days
# [1]     0.0000     0.0000     0.0000     0.0000     0.0000     0.0000
# [7]     0.0000     0.0000     0.0000     0.0000     0.0000     0.0001
#[13]     0.0002     0.0007     0.0007     0.0035     0.0035     0.0104
#[19]     0.0104     0.0417     0.1250     0.1250     0.2500     1.0000
#[25]     7.0000     7.0000    30.4375    30.4375    91.3125    91.3125
#[31]   365.2500  1826.2500  9131.2500 36525.0000

在哪里x

x <- list(c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 1, 7, 7, 30, 30, 91, 91, 365, 1826, 9131, 36525
), c(1, 1, 2, 5, 10, 25, 50, 100, 250, 500, 1000, 5000, 15000, 
60000, 60000, 3e+05, 3e+05, 9e+05, 9e+05, 3600000, 10800000, 
10800000, 21600000, 0, 0, 0, 37800000, 37800000, 2.7e+07, 2.7e+07, 
21600000, 21600000, 21600000, 0))
于 2017-03-06T10:16:43.820 回答