我有一个很长的列表,需要日期之间的天数
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我需要一个新的专栏写着
ClientID Visit Days
00932 2018-11-10 0
00932 2018-11-20 10
00932 2018-11-25 15发布于 2021-09-25 05:34:43
将Visit更改为date类,并为每个ClientID减去具有最小Visit日期的Visit。
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 15data
ClientID <- c("00932", "00932", "00932")
Visit <- c("11-10-2018", "11-20-2018", "11-25-2018")
df <- data.frame(ClientID, Visit)发布于 2021-09-25 05:58:23
考虑到您有多个ClientID,并且想要计算该级别上的Days:
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和两个观察值以更好地演示它:
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按照注释中的要求添加函数:
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发布于 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
找到跨度。
https://stackoverflow.com/questions/69323407
复制相似问题