【问题标题】:Subtract the first cell from one column and subtract it from the second cell in a different column从一列中减去第一个单元格,然后从另一列中的第二个单元格中减去它
【发布时间】:2021-10-18 21:17:27
【问题描述】:

我有一个阶段开始时间和阶段结束时间的数据框。我想从前一阶段的结束时间中减去一个阶段的开始时间。即,我想从一列和另一列中的 n-1 单元格中减去第 n 个单元格。这在 Excel 中很容易做到,但我不确定如何在 R 中做到这一点。

这是数据的样子。我也包含了数据的 dput():

#test data frame
Stage   StartTime             EndTime
102   2021-07-19 17:23:00   2021-07-19 21:53:24
103   2021-07-19 21:54:00   2021-07-19 23:00:14
104   2021-07-19 23:01:00   2021-07-20 00:50:10
105   2021-07-20 00:51:00   2021-07-20 01:50:58
106   2021-07-20 01:51:00   2021-07-20 03:28:22
107   2021-07-20 03:29:00   2021-07-20 04:28:00
108   2021-07-20 05:38:00   2021-07-20 08:19:26


> dput(test[1:7,])
structure(list(Stage = c(102, 103, 104, 105, 106, 107, 108), 
    StartTime = structure(c(1626733380, 1626749640, 1626753660, 
    1626760260, 1626763860, 1626769740, 1626777480), tzone = "", class = c("POSIXct", 
    "POSIXt")), EndTime = structure(c(1626749604, 1626753614, 
    1626760210, 1626763858, 1626769702, 1626773280, 1626787166
    ), tzone = "", class = c("POSIXct", "POSIXt")), row.names = c(NA, -7L), class = c("tbl_df", 
"tbl", "data.frame"))

例如,我知道我可以手动执行以下操作来获取阶段 102 结束和阶段 103 开始​​之间的时间差:

as.numeric(difftime("2021-07-19 21:54:00", "2021-07-19 21:53:24", units='sec'))
 > 36

我试图使它更通用,但这不起作用。但是,我们的想法是每次都将 1 添加到行索引:

#does not work
# want to subtract row 2, col 2 - the later starting time
# from row 1, col 3 - the earlier end time

as.numeric(difftime(test[1,3], test[2,2], units='sec'))

保存时差的位置无关紧要,无论是数据框中的新列还是全新的数据框。什么都行。我真的不知道该怎么做。也许是一个循环?任何帮助,将不胜感激。谢谢。

【问题讨论】:

    标签: r dataframe difference rowwise


    【解决方案1】:

    您可以使用the lag 函数将日期作为向量处理,例如

    library(tidyverse)
    
    data_example <-
      structure(list(
        Stage = c(102, 103, 104, 105, 106, 107, 108),
        StartTime = structure(
          c(
            1626733380,
            1626749640,
            1626753660,
            1626760260,
            1626763860,
            1626769740,
            1626777480
          ),
          tzone = "",
          class = c("POSIXct",
                    "POSIXt")
        ),
        EndTime = structure(
          c(
            1626749604,
            1626753614,
            1626760210,
            1626763858,
            1626769702,
            1626773280,
            1626787166
          ),
          tzone = "",
          class = c("POSIXct", "POSIXt")
        )
      ))
    
    tibble_df <- data_example |> as_tibble()
    
    
    tibble_df |> 
      mutate(time_diff = difftime(StartTime,lag(EndTime)))
    #> # A tibble: 7 x 4
    #>   Stage StartTime           EndTime             time_diff
    #>   <dbl> <dttm>              <dttm>              <drtn>   
    #> 1   102 2021-07-19 19:23:00 2021-07-19 23:53:24   NA secs
    #> 2   103 2021-07-19 23:54:00 2021-07-20 01:00:14   36 secs
    #> 3   104 2021-07-20 01:01:00 2021-07-20 02:50:10   46 secs
    #> 4   105 2021-07-20 02:51:00 2021-07-20 03:50:58   50 secs
    #> 5   106 2021-07-20 03:51:00 2021-07-20 05:28:22    2 secs
    #> 6   107 2021-07-20 05:29:00 2021-07-20 06:28:00   38 secs
    #> 7   108 2021-07-20 07:38:00 2021-07-20 10:19:26 4200 secs
    

    reprex package (v2.0.1) 于 2021-10-18 创建

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多