R:应用函数中 as.POSIXct() 的最佳方法

标签 r date apply posixct

我正在尝试设置一个新变量,其中包含已知日期与给定年份结束之间的差异(天数)。下面的虚拟数据:

> Date.event <- as.POSIXct(c("12/2/2000","8/2/2001"), format = "%d/%m/%Y", tz = "Europe/London")
> Year = c(2000,2001)
> Dates.test <- data.frame(Date.event,Year)
> Dates.test
  Date.event Year
1 2000-02-12 2000
2 2001-02-08 2001

我尝试应用一个函数来实现此目的,但它返回一个错误

> Time.dif.fun <- function(x) {
+ as.numeric(as.POSIXct(sprintf('31/12/%s', s= x['Year']),format = "%d/%m/%Y", tz = "Europe/London") - x['Date.event'])
+ }
> Dates.test$Time.dif <- apply(
+ Dates.test, 1, Time.dif.fun
+ )

 Error in unclass(e1) - e2 : non-numeric argument to binary operator 

似乎 apply() 不喜欢 as.POSIXct(),因为测试的函数版本仅导出年末日期,它以“978220800”形式返回为数字(例如,对于 end 2000 年)。有没有办法解决?对于真实数据,该函数有点复杂,包括使用不同变量的条件实例,有时引用前一行,如果不应用,这将很难做到。

最佳答案

以下是一些替代方案:

1) 您的代码可以适应这些更改。我们将 s 分解出来,并不是因为它是必要的,而只是因为如果没有它,下面的行由于其长度而变得非常难以阅读。请注意,如果 x是一个数据框,那么 x["Year"] 也是但是x[["Year"]]是一个向量 x$Year 。由于操作都是矢量化的,我们不需要 apply

虽然我们没有进行此更改,但将 s 定义为 s <- paste0(x$Year, "-12-31") 会更容易一些。在这种情况下,由于使用默认格式,我们可以省略下一行中的格式参数。

Time.dif.fun <- function(x) {
  s <- sprintf('31/12/%s', x[['Year']])
  as.numeric(as.POSIXct(s, format = "%d/%m/%Y", tz = "Europe/London") -x[['Date.event']])
}
Time.dif.fun(Dates.test)
## [1] 323 326

2) 转换为 POSIXlt,将年月日设置为年底并减去。请注意,年份部分使用自 1900 年以来的年份,而月份部分使用 Jan = 0、Feb = 1、...、Dec = 11。请参阅 ?as.POSIXlt有关这些和其他组件的详细信息:

lt <- as.POSIXlt(Dates.test$Date.event)
lt$year <- Dates.test$Year - 1900
lt$mon <- 11
lt$mday <- 31
as.numeric(lt - Dates.test$Date.event)
## [1] 323 326

3)另一种可能性是:

with(Dates.test, as.numeric(as.Date(paste0(Year, "-12-31")) - as.Date(Date.event)))
## [1] 323 326

关于R:应用函数中 as.POSIXct() 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45817361/

相关文章:

mysql - 如何在MySQL中高效查找两个日期之间的特定天数?

r - R中的apply()与sweep()

python-3.x - python : pandas apply function: InvalidIndexError

Python 与 R : apply a function to each element in a vector

r - ggplot几何点,修改文本

r - 根据另一个表更新数据框变量

r - 从模型性能计算中排除缺失值

r - 在rentrez中使用entrez_fetch解析PubMed XML

javascript - 如何计算两个日期之间的时间段 - angularjs

javascript - 在 Javascript/NodeJS 中返回调整时区的当前日期,然后在早上 6 点找到相当于用户时间的 UTC