首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中日期之间的递增天数

R中日期之间的递增天数
EN

Stack Overflow用户
提问于 2021-09-25 05:26:56
回答 3查看 67关注 0票数 0

我有一个很长的列表,需要日期之间的天数

代码语言:javascript
复制
ClientID <- c("00932", "00932", "00932")
Visit <- c("2018-11-10", "2018-11-20", "2018-11-25")

ClientID    Visit
00932    2018-11-10
00932    2018-11-20
00932    2018-11-25

我需要一个新的专栏写着

代码语言:javascript
复制
ClientID    Visit    Days
00932    2018-11-10    0
00932    2018-11-20    10
00932    2018-11-25    15
EN

回答 3

Stack Overflow用户

发布于 2021-09-25 05:34:43

Visit更改为date类,并为每个ClientID减去具有最小Visit日期的Visit

代码语言:javascript
复制
library(dplyr)

df %>%
  mutate(Visit = as.Date(Visit, '%m-%d-%Y')) %>%
  group_by(ClientID) %>%
  mutate(Days = as.integer(Visit - min(Visit))) %>%
  ungroup

# ClientID Visit       Days
#  <chr>    <date>     <int>
#1 00932    2018-11-10     0
#2 00932    2018-11-20    10
#3 00932    2018-11-25    15

data

代码语言:javascript
复制
ClientID <- c("00932", "00932", "00932")
Visit <- c("11-10-2018", "11-20-2018", "11-25-2018")
df <- data.frame(ClientID, Visit)
票数 2
EN

Stack Overflow用户

发布于 2021-09-25 05:58:23

考虑到您有多个ClientID,并且想要计算该级别上的Days

代码语言:javascript
复制
library(lubridate)
library(tidyverse)

ClientID <- c("00932", "00932", "00932")
Visit <- c("11-10-2018", "11-20-2018", "11-25-2018")

df <- data.frame(ClientID, Visit)

df %>%
  group_by(ClientID) %>%
  mutate(Visit= mdy(Visit),
         Days= as.numeric(Visit-lag(Visit)))%>%
  ungroup()%>%
  mutate_if(is.numeric, ~replace_na(., 0))

# A tibble: 3 x 3
  ClientID Visit       Days
  <chr>    <date>     <dbl>
1 00932    2018-11-10     0
2 00932    2018-11-20    10
3 00932    2018-11-25     5

添加另一个ClientID和两个观察值以更好地演示它:

代码语言:javascript
复制
ClientID <- c("00932", "00932", "00932", "00935", "00935")
Visit <- c("11-10-2018", "11-20-2018", "11-25-2018",  "11-20-2019", "11-25-2019")

df <- data.frame(ClientID, Visit)

df %>%
  group_by(ClientID) %>%
  mutate(Visit= mdy(Visit),
         Days= as.numeric(Visit-lag(Visit)))%>%
  ungroup()%>%
  mutate_if(is.numeric, ~replace_na(., 0))

# A tibble: 5 x 3
  ClientID Visit       Days
  <chr>    <date>     <dbl>
1 00932    2018-11-10     0
2 00932    2018-11-20    10
3 00932    2018-11-25     5
4 00935    2019-11-20     0
5 00935    2019-11-25     5

按照注释中的要求添加函数:

代码语言:javascript
复制
days_func <- function(df){
  
  df %>%
    group_by(ClientID) %>%
    mutate(Visit= mdy(Visit),
           Days= as.numeric(Visit-lag(Visit)))%>%
    ungroup()%>%
    mutate_if(is.numeric, ~replace_na(., 0))->df
  
  return(df)
}

df1 <- days_func(df)

df1

# A tibble: 3 x 3
  ClientID Visit       Days
  <chr>    <date>     <dbl>
1 00932    2018-11-10     0
2 00932    2018-11-20    10
3 00932    2018-11-25     5
票数 2
EN

Stack Overflow用户

发布于 2021-09-25 05:39:49

由于我假设您需要日期之间的日期跨度,而不是日期和最新日期之间的日期跨度,我建议这样做:

dn <- as.numeric(as.Date(Visit))

带有日期的文本始终转换为日期和数字。

dn2 <- c(dn[1], dn[-length(dn)])

我们准备第二个向量进行减法,因为它的工作速度很快。它的成员顺序如下:

df df2

第一个第一个

第2个1

第3次2次

第n第nth-1

Days <- dn - dn2

找到跨度。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69323407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档