[英]Mutate min date per group using filter conditions in dplyr
我希望創建一個新列,其中包含滿足某些條件的每個組的最短日期。
我的數據如下所示:
mbr <- c('A','A','A','A','B','B','B')
drg_typ <- c('TGT','TGT','TGT','Other','Other','TGT','TGT')
dt <- as.Date(c('2018-01-01','2019-06-30','2019-03-18','2017-01-01','2018-01-01','2016-01-01','2019-05-01'))
df <- data.frame(mbr,drg_typ,dt)
mbr drg_typ dt
A TGT 2018-01-01
A TGT 2019-06-30
A TGT 2019-03-18
A Other 2017-01-01
B Other 2018-01-01
B TGT 2016-01-01
B TGT 2019-05-01
我希望改變一個名為 min_dt 的新列,它使用以下邏輯在mbr
的組級別執行:
對於 drg_typ = 'TGT' 且 dt 在 2019-01-01 和 2019-12-31 之間的每個 mbr,填充一個名為 min_dt 的新列,其中 dt 的最小值介於上述日期值之間。
我努力了:
df <- df %>%
group_by(mbr) %>%
mutate(min_dt = if_else(drg_typ == 'TGT' & dt >= '2019-01-01' & dt <= '2019-12-31', min(dt),0))
但我收到以下錯誤:
Error in as.Date.numeric(value) : 'origin' must be supplied
我檢查了我的數據框的結構, dt
是一個日期
> str(df)
'data.frame': 7 obs. of 3 variables:
$ mbr : Factor w/ 2 levels "A","B": 1 1 1 1 2 2 2
$ drg_typ: Factor w/ 2 levels "Other","TGT": 2 2 2 1 1 2 2
$ dt : Date, format: "2018-01-01" "2019-06-30" "2019-03-18" "2017-01-01" ...
我最終的 output 應該如下所示:
mbr drg_typ dt min_dt
A TGT 2018-01-01 2019-03-18
A TGT 2019-06-30 2019-03-18
A TGT 2019-03-18 2019-03-18
A Other 2017-01-01 2019-03-18
B Other 2018-01-01 2019-05-01
B TGT 2016-01-01 2019-05-01
B TGT 2019-05-01 2019-05-01
0
是一個問題, if_else
檢查類型。 這里的true
是Date
class 類型,而false
是數字類型。 相反,它可以是NA
並使用as.Date
將其轉換為Date
library(dplyr)
df %>%
group_by(mbr) %>%
mutate(min_dt = if_else(drg_typ == 'TGT' &
dt >= '2019-01-01' & dt <= '2019-12-31', min(dt), as.Date(NA)))
基於預期的 output,我們這里不需要if_else
。 'dt' 的min
可以基於邏輯表達式
df %>%
group_by(mbr) %>%
mutate(min_dt = min(dt[drg_typ == 'TGT' &
between(dt, as.Date('2019-01-01'), as.Date('2019-12-31'))]))
# A tibble: 7 x 4
# Groups: mbr [2]
# mbr drg_typ dt min_dt
# <fct> <fct> <date> <date>
#1 A TGT 2018-01-01 2019-03-18
#2 A TGT 2019-06-30 2019-03-18
#3 A TGT 2019-03-18 2019-03-18
#4 A Other 2017-01-01 2019-03-18
#5 B Other 2018-01-01 2019-05-01
#6 B TGT 2016-01-01 2019-05-01
#7 B TGT 2019-05-01 2019-05-01
或使用data.table
library(data.table)
setDT(df)[, min_dt := min(dt[drg_typ == 'TGT' &
between(dt, as.Date('2019-01-01'), as.Date('2019-12-31'))]), mbr]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.