【问题标题】:How to calculate time interval for a subset?如何计算子集的时间间隔?
【发布时间】:2019-09-10 00:25:47
【问题描述】:

我想计算数据框子集的时间间隔。以下是一些示例数据:

dates
Model start test1 test2
1 2010-09-01 2014-09-09 2019-09-09 
2 2010-06-01 2014-06-06 2019-06-06

又名

dates <- structure(list(Model = 1:2, start = c("2010-09-01", "2010-06-01"), test1 = c("2014-09-09", "2014-06-06"), test2 = c("2019-09-09", 
"2019-06-06")), row.names = c(NA, -2L), class = "data.frame")

假设我想将模型 1 的间隔计算为从 starttest1 的时间。我将新变量称为elapsed。我试过了:

library(lubridate)
dates$start <- as_date(dates$start)
dates$test1 <- as_date(dates$test1)
dates$elapsed[dates$Model==1] <- dates$start %--% dates$test1

我收到此警告消息:

In dates$elapsed[dates$Model == 1] <- dates$start %--% dates$test1 : number of items to replace is not a multiple of replacement length

结果看起来还不错。

dates$elapsed <- round(as.duration(dates$elapsed) / dyears(1),digits=2)
dates$elapsed
[1] 4.02   NA

我在这里找到了一些解释Getting an error "number of items to replace is not a multiple of replacement length",但我仍然不确定如何避免警告。谢谢。

【问题讨论】:

    标签: r lubridate


    【解决方案1】:

    用这个替换你的最后一行:

    library(tidyverse)
    dates %>% mutate(elapsed = ifelse(Model==1, start %--% test1, NA))
    

    将避免警告,并获得相同的结果。

    【讨论】:

      【解决方案2】:

      警告完全有意义,因为要替换的项目数 (dates$elapsed[dates$Model==1]) 的长度为 1,而替换长度 (dates$start %--% dates$test1) 的长度为 2。

      length(dates$elapsed[dates$Model==1])
      #[1] 1
      
      length(dates$start %--% dates$test1)
      #[1] 2
      

      你需要从两边子集(dates$Model==1

      library(lubridate)
      dates$elapsed[dates$Model==1] <- dates$start[dates$Model==1] %--% dates$test1[dates$Model==1]
      
      #dates
      #  Model      start      test1      test2   elapsed
      #1     1 2010-09-01 2014-09-09 2019-09-09 126921600
      #2     2 2010-06-01 2014-06-06 2019-06-06        NA
      

      【讨论】:

        猜你喜欢
        • 2015-06-15
        • 1970-01-01
        • 1970-01-01
        • 2014-02-18
        • 1970-01-01
        • 2012-08-14
        • 2022-06-01
        • 2021-07-23
        相关资源
        最近更新 更多