当前位置: 首页 > 知识库问答 >
问题:

使用dplyr中的过滤条件更改每个组的最小日期

颜思淼
2023-03-14

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

我的数据如下所示:

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,用介于上述日期值之间的最小dt值填充一个名为min_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

共有1个答案

蒋嘉实
2023-03-14

< code>0是一个问题,由< code>if_else检查类型。这里的< code>true是类型< code>Date类,而< code>false是数字。相反,它可以是< code>NA并将其转换为< code>Date,其中< code >为。日期

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。“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

或者使用< code>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]
 类似资料:
  • 我有一个这样的数据帧(示例): 我想创建一个名为 的列,它显示行与其最接近(取决于)的条件行(指标 == True)的差异,其中条件行每的值为 0。以下是所需的输出: 如您所见,它分别返回差值,最接近的 True 行,其中条件行的 为 0。所以我想知道是否有人知道必须使用获得所需的结果? 额外信息列Diff: 我们以A组为例。列< code>Diff由相对于指示器为True的最近的行的差来计算。比

  • 问题内容: 我有下表 我想实现只选择具有日期最大值的ID的结果。IE id,value,adate 我该如何使用呢?我做了如下,但它不起作用。 有人可以协助查询吗? 问题答案: 如果您使用的是具有分析功能的DBMS,则可以使用ROW_NUMBER: 否则,您将需要使用按ID联接到聚合的最大日期,以将结果从中筛选出来,仅过滤到那些日期与该ID的最大日期相匹配的对象

  • 问题内容: 我有一个表中的输入数据。表格数据看起来像 。对于客户带来的每件商品,表中都有单独的一行。例如,如果c1购买i1,i2,i3,i4,i5,则表中将有5行。 现在,我要插入elasticsearch的数据是这样的: 如何在logstash中如上所述修改输入? 而且我的架构看起来像这样: 物品:item_id,item_name 购买:cust_id,item_id 另外,能否请您提出要进行

  • 问题内容: 我想像这样做一个ElasticSearch查询: 我试图像这样在NEST中实现它: 但这给了我这样的查询,其中的过滤器包装在 布尔值中 : 我应该如何更改我的NEST代码以提供正确的查询?是否必须将我的条款添加到 QueryContainer之外的 其他项目中? 问题答案: 如果要检查条件过滤器,可以在查询之前创建过滤器列表,如下所示: 如果在进行过滤器查询之前不需要检查任何条件,则可

  • 问题内容: 上面是我的查询,我想获取一个人每天的记录。该记录应具有当天的最小日期时间。我需要该日期时间的完整记录 我的预期输出在这里 我尝试使用 但是对于“ t1”,我得到id = 1和第一行的输入日期。 请帮帮我。如果重复,则提供链接。 问题答案: 演示

  • 我正在尝试提出一种算法,用于将团队排序并分配给固定数量的用户。我发现的大多数算法都假设要除以的组数;我想创建一个智能系统,其中组自动分配(尽其最大能力),并根据总用户数以及每个组的最小和最大用户数进行预测。 为每一组假设以下标准: < li >每组最少3个 < li >每组最多6个 < li >基于用户总数的智能分组 以下是基于总用户数和每个组的最小/最大值的一些可能性: 对于24名成员: 4组5