R 如何使用difftime计算前几行值的天数差异?

R 如何使用difftime计算前几行值的天数差异?,r,R,下面的代码创建数据: 但返回错误: Error in mutate_impl(.data, dots) : Evaluation error: invalid subscript type 'closure'. 要按id计算天数之间的累计差异,可以使用: mydata %>% group_by(id) %>% mutate(DaysSpent = as.numeric(difftime(dmy_hm(step1),

下面的代码创建数据:

但返回错误:

Error in mutate_impl(.data, dots) : 
  Evaluation error: invalid subscript type 'closure'.
要按id计算天数之间的累计差异,可以使用:

mydata %>% 
  group_by(id) %>% 
  mutate(DaysSpent = as.numeric(difftime(dmy_hm(step1), 
                                         dmy_hm(step1)[1], units = 'days')))
如何计算上一行之间的天数差

我想我需要访问当前行和上一行作为mutate的一部分


更新:每个id的行数是可变的。

我不确定您要查找的结果是什么,但是如果在第一个
行数之后添加
()
,我没有收到错误

此外,为了以防万一,还添加了一个
arrange()

library(dplyr)
library(lubridate)
mydata %>% 
  group_by(id) %>% 
  # arrange(step1) %>%
  mutate(DaysSpent = as.numeric(
    difftime(dmy_hm(step1)[row_number()+1], ## this is where I added ()
             dmy_hm(step1)[row_number()], units = 'days')))

使用
数据。表
这可以通过
shift
完成:

library(data.table)

setDT(mydata)[, DaysSpent := difftime(dmy_hm(step1), dmy_hm(shift(step1, type = "lag")), units = "days"), by = id]

#   id rowNumId            step1       DaysSpent
#1:  1        1 30-12-2010:11.02         NA days
#2:  1        2 31-12-2010:10.06  0.9611111 days
#3:  1        3 01-01-2011:15.12  1.2125000 days
#4:  2        4 01-03-2017:09.00         NA days
#5:  2        5 01-05-2017:09.00 61.0000000 days
#6:  3        6 01-06-2017:09.00         NA days
#7:  3        7 01-07-2017:09.00 30.0000000 days
我认为使用
lag()
更适合此任务:

library(dplyr)
library(lubridate)
mydata %>% 
  group_by(id) %>% 
  mutate(
    DaysSpent = as.numeric(difftime(
      dmy_hm(step1), lag(dmy_hm(step1)), units = 'days'
    ))
  )

还考虑将列<代码>步骤1>代码>从开始到:

mydata %>% 
  group_by(id) %>% 
  mutate(
    step1 = dmy_hm(step1),
    DaysSpent = as.numeric(difftime(
      step1, lag(step1), units = 'days'
    ))
  )

如果每个id只有2行,您可以使用
first
last
mydata%>%groupby(id)%%>%mutate(ind=as.numeric(difftime(dmy_-hm(first(step1)),dmy_-hm(last(step1))
@akrun每个id的行数是可变的,我的更新问题,谢谢。在按
id
分组后,您可以使用
dplyr::lag
谢谢,但您的代码似乎返回负的日值您的代码在不返回错误的情况下返回负的日值。我会修好我的。。。
library(dplyr)
library(lubridate)
mydata %>% 
  group_by(id) %>% 
  mutate(
    DaysSpent = as.numeric(difftime(
      dmy_hm(step1), lag(dmy_hm(step1)), units = 'days'
    ))
  )
mydata %>% 
  group_by(id) %>% 
  mutate(
    step1 = dmy_hm(step1),
    DaysSpent = as.numeric(difftime(
      step1, lag(step1), units = 'days'
    ))
  )