gpt4 book ai didi

r - 使用 dplyr 中的过滤条件改变每组的最小日期

转载 作者:行者123 更新时间:2023-12-04 09:56:02 25 4
gpt4 key购买 nike

我希望创建一个新列,其中包含满足某些条件的每个组的最小日期。

我的数据如下所示:

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" ...

我的最终输出应如下所示:
 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上课时 false是数字。相反,它可以是 NA并将其转换为 Dateas.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)))

基于预期的输出,我们不需要 if_else这里。 min 'dt' 可以基于逻辑表达式
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]

关于r - 使用 dplyr 中的过滤条件改变每组的最小日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61923578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com