lubridate中的意外值as.numeric使用值月份单位arg
问题描述:
我无法理解使用单位arg中的月份值的结果,当我在lubridate包中使用as.numeric和period时。 也许它是一个包?lubridate中的意外值as.numeric使用值月份单位arg
a <- period(years = 1, months = 3, days = 1)
as.numeric(a, 'days')
as.numeric(a, 'years')
as.numeric(a, 'months')
结果:
> as.numeric(a, 'days')
[1] 457.5625
> as.numeric(a, 'years')
[1] 1.252738
> as.numeric(a, 'months')
[1] 0.1043948
> sessionInfo()
R version 3.3.2 (2016-10-31)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Linux Mint LMDE
locale:
[1] LC_CTYPE=es_AR.UTF-8 LC_NUMERIC=C LC_TIME=es_AR.UTF-8 LC_COLLATE=es_AR.UTF-8 LC_MONETARY=es_AR.UTF-8
[6] LC_MESSAGES=es_AR.UTF-8 LC_PAPER=es_AR.UTF-8 LC_NAME=C LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=es_AR.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] dplyr_0.5.0 purrr_0.2.2 readr_1.0.0 tidyr_0.6.1 tibble_1.2
[6] ggplot2_2.2.1 tidyverse_1.1.1 pgr_0.0.9002 myutilities_0.0.0.9014 magrittr_1.5
[11] lubridate_1.6.0
loaded via a namespace (and not attached):
[1] Rcpp_0.12.9 plyr_1.8.4 forcats_0.2.0 tools_3.3.2 jsonlite_1.2 gtable_0.2.0 nlme_3.1-128
[8] lattice_0.20-34 psych_1.6.12 DBI_0.5-1 RPostgreSQL_0.4-1 parallel_3.3.2 haven_1.0.0 stringr_1.1.0
[15] httr_1.2.1 xml2_1.1.1 hms_0.3 grid_3.3.2 R6_2.2.0 readxl_0.1.1 foreign_0.8-67
[22] reshape2_1.4.2 modelr_0.1.0 scales_0.4.1 assertthat_0.1 mnormt_1.5-5 rvest_0.3.2 colorspace_1.3-2
[29] stringi_1.1.2 lazyeval_0.2.0 munsell_0.4.3 broom_0.4.1
在此先感谢
答
这看起来像一个错误。我相信,这种转换使用lubridate:::seconds_to_unit
,这对lubridate 1.6.0版本看起来是这样完成的:
> lubridate:::seconds_to_unit
function (secs, unit = "second")
{
switch(unit, second = secs, minute = secs/60, hour = secs/3600,
day = secs/86400, month = secs/(86400 * 365.25)/12, week = secs/(86400 *
7), year = secs/(86400 * 365.25), stop("invalid unit ",
unit))
}
<environment: namespace:lubridate>
注意:此部分:
month = secs/(86400 * 365.25)/12
显然,这里的想法是,86400*365.25
是秒每年,并将其除以12
每月会产生几秒。但它应该是:
month = secs/((86400 * 365.25)/12)
(注意额外的括号)
由于这个错误的结果,你得到的答案是小144倍,比它应该是。
我相信这也是这个错误的原因:https://github.com/hadley/lubridate/issues/490
(在那里,它被描述成给出预期结果的倒数这只是因为他们碰巧捡12个月的间隔,所以将由144给你1/12的一个月,而不是。)
是的,你是对的。我把'as.numeric(a,“秒”)/(86400 * 365.25)/ 12 [1] 0.1043948 > as.numeric(a,“seconds”)/((86400 * 365.25)/ 12) [1] 15.03285'。非常感谢。 – Diego
不客气。 :)我也刚刚向lubridate提交了一个包含修正的请求:https://github.com/hadley/lubridate/pull/524 –