【问题标题】:Substract date from previous row by group (using R)按组从前一行中减去日期(使用 R)
【发布时间】:2019-05-01 19:05:18
【问题描述】:

我有一个与这个 (subtract value from previous row by group) 类似的问题,但我想按组 ID 从当前日期中减去前一个日期,以便获得估计的天数。我尝试编辑之前建议的脚本,将“值”替换为 “日期”。 尽管我尝试了不同的建议方法,但我不断收到此错误消息“mutate_impl(.data, dots) 中的错误: 评估错误:无法为签名“POSIXct”找到函数的继承方法。”

Data
id      date        
2380    10/30/12    
2380    10/31/12    
2380    11/1/12     
2380    11/2/12     
20100   10/30/12    
20100   10/31/12   
20100   11/1/12     
20100   11/2/12     
20103   10/30/12

我想要这种桌子

Data
id      date        date_difference(in days)
2380    10/30/12    0
2380    10/31/12    1
2380    11/1/12     2
2380    11/2/12     3
20100   10/30/12    0
20100   10/31/12    2
20100   11/1/12     3
20100   11/2/12     4
20103   10/30/12    0
20103   10/31/12    1

【问题讨论】:

  • ?as.Date, ?diff, c(0, diff( ... ))
  • 对于分组部分,还请查看:data.table::dplyr::?base::ave
  • 还有:20100 10/30/12 1 应该是 20100 10/30/12 0,对吧?
  • 如果您的真正意思是“从当前日期减去前一个日期”,那么您的大部分date_difference 值都是不正确的。也许您的意思是“将第一个日期减去id
  • 另见?dplyr::lag

标签: r dataframe dplyr lag


【解决方案1】:
library(tidyverse)
library(lubridate)
#> 
#> Attaching package: 'lubridate'
#> The following object is masked from 'package:base':
#> 
#>     date

df <- tribble(~id,      ~date,      
2380,    "10/30/12",    
2380,   "10/31/12",    
2380,  "11/1/12",  
2380,    "11/2/12",  
20100,   "10/30/12",    
20100,   "10/31/12",   
20100,   "11/1/12",   
20100,   "11/2/12",   
20103,   "10/30/12",
20103,   "10/31/12")

df %>% 
  mutate(date = mdy(date)) %>% 
  group_by(id) %>% 
  mutate(date_difference = as.numeric(date - first(date)))
#> # A tibble: 10 x 3
#> # Groups:   id [3]
#>       id date       date_difference
#>    <dbl> <date>               <dbl>
#>  1  2380 2012-10-30               0
#>  2  2380 2012-10-31               1
#>  3  2380 2012-11-01               2
#>  4  2380 2012-11-02               3
#>  5 20100 2012-10-30               0
#>  6 20100 2012-10-31               1
#>  7 20100 2012-11-01               2
#>  8 20100 2012-11-02               3
#>  9 20103 2012-10-30               0
#> 10 20103 2012-10-31               1

reprex package (v0.2.1) 于 2018 年 11 月 29 日创建

【讨论】:

  • 谢谢。与 stringi 派生脚本相比,它更容易
【解决方案2】:

首先,创建一个计算日差的函数

library(stringr)

day_diff <- function(day) {
    days <- difftime(day, "2012-10-30", "days")
    str_extract(days, "\\-*\\d+\\.*\\d*")
}

然后创建一个包含日期差异的新列

df$date_difference <- unlist(lapply(df$date, day_diff))

您可能会看到缺少时区的警告(),但您可以在此处表示(或忽略)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多