根据条件进行条件总结,并每月对组重复,使用dplyr更改日期间隔范围

根据条件进行条件总结,并每月对组重复,使用dplyr更改日期间隔范围,r,dplyr,R,Dplyr,如果每个id都满足以下条件,我将尝试汇总,并在中创建一个列,其中包含案例。\u:sum amount(在特定月份)至少为10,且至少为两个不同日期(在特定月份) 我们的想法是创建一个名为2020-01的新列,如果满足这些条件,则为1,否则为0 library(dplyr) df <- data.frame( date = as.Date(c("2020-01-01", "2020-01-01", "2020-02-01", &q

如果每个
id
都满足以下条件,我将尝试
汇总
,并在
中创建一个列,其中包含
案例。\u:sum amount(在特定月份)至少为10,且至少为两个不同日期(在特定月份)

我们的想法是创建一个名为
2020-01
的新列,如果满足这些条件,则为1,否则为0

library(dplyr)

df <- data.frame(
date = as.Date(c("2020-01-01", "2020-01-01", "2020-02-01", "2020-02-02", "2020-03-01", "2020-03-02", "2020-01-05", "2020-01-08", "2020-02-18", "2020-02-18", "2020-03-01", "2020-03-02", "2020-01-01", "2020-01-01", "2020-02-01", "2020-02-02", "2020-03-01", "2020-03-02")),
id = c("A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "C", "C", "C", "C", "C", "C"),
amount = c(1, 5, 5, 5, 6, 2, 10, 4, 8, 10, 6, 5, 5, 1, 6, 2, 5, 5)
)
使用此向量,我可以创建一个包含所有
id
case\u的概览,如果if满足此条件,则当
为1时:

df_overview <- df %>%
distinct(id) %>%
mutate(`2020-01` =
    case_when(id %in% df_2020_01 ~ 1,
    TRUE ~ 0))

我希望我能清楚地解释我的问题。提前谢谢

修订后的新答案(2个月后开始)

库(tidyverse)
图书馆(lubridate)
df%
选择(-data)%%>%
枢轴(名称从=日期,
值_from=res)%>%
用(~str_sub(,1,7),匹配项(“^\\d{4}-\\d{2}”)重命名_
#>#tibble:3 x 4
#>id`2020-01``2020-02``2020-03`
#>                  
#>1 A NA NA 0
#>2b NA NA 1
#>3c-NA-NA-1
由(v0.3.0)于2020年6月29日创建

新答案(适用于自定义月数)

为了不只是考虑两个月,而是考虑任何可能的月数,我改变了方法。它使用两个自定义函数

库(tidyverse)
图书馆(lubridate)
df%
#调用comb_calc并选择月数(此处为2)
突变(res=comb_calc(数据,日期,2))%>%
选择(-data)%%>%
枢轴(名称从=日期,
值_from=res,
值\u fill=0)%>%
用(~str_sub(,1,7),匹配项(“^\\d{4}-\\d{2}”)重命名_
#>#tibble:3 x 4
#>id`2020-01``2020-02``2020-03`
#>                  
#>1 A 0 1 0
#>2b101
#>3C01
由(v0.3.0)于2020年6月29日创建

旧答案(有效期为两个月)

库(tidyverse)
df%
总结(
金额=总和(金额),
日期不同=n不同(日期)
) %>%
解组()%>%
过滤器(金额总和>=10,日期不同>=2)%>%
拉力(id)
}
df%>%
突变(月=粘贴(lubridate::年(日期),lubridate::月(日期),sep=“-”))%%>%
嵌套单位(月)%>%
解组()%>%
突变(数据2=滞后(数据))%>%
行(月)%>%
mutate(data2=list(bind_行(data,data2)),
res=列表(计算id(数据)),
id=列表(计算id(数据2)))%>%
解组()%>%
mutate(res2=lag(res,default=list(“”))%>%
未测试(res)%>%
未测试(res2)%>%
unnest(id)%%>%
过滤器(!id==res2)%>%
选择(月份,id)%>%
不同的()%>%
突变(val=1)%>%
枢轴(名称从=月份),
值_from=val,
值\u fill=0)%>%
安排(id)
#>`summary()`解组输出(用`.groups`参数重写)
#>`summary()`解组输出(用`.groups`参数重写)
#>`summary()`解组输出(用`.groups`参数重写)
#>`summary()`解组输出(用`.groups`参数重写)
#>`summary()`解组输出(用`.groups`参数重写)
#>`summary()`解组输出(用`.groups`参数重写)
#>#tibble:3 x 4
#>id`2020-1``2020-2``2020-3`
#>               
#>1 A 0 1 0
#>2b101
#>3C01

由(v0.3.0)于2020-06-27创建

您能显示预期的output@akrun刚刚添加了所需的输出。请注意,我已经编辑了上述金额。谢谢!只有一个问题:仍在努力理解第二部分。如果我想将日期间隔期从2个月增加到12个月(用于计算
amount\u sum
date\u distinct
履行),是否可能?请检查我的修订答案。谢谢您的修订答案-几乎就到了!两个问题:(1)在
pivot\u wider
之后,列顺序变得混乱。之后尝试使用
select(order(colnames())
进行更正,但无效。是否有必要在1-9(例如2019-09)之间的年份和月份之间添加0?是否可以为只有一位数字的月份(即01-09月份)添加0?(2) 是否可以仅在特定的月数之后开始计算-即,对于上述示例(仅2个月),仅从第三个月开始计算,然后按月计算(即2020-03、2020-04)?关于(1)我更新了代码,它现在应该可以工作,如果没有,请提供更多示例数据,说明在应用
pivot\u\u wide
后,订单混乱。关于(2),我增加了一个额外的版本,两个月后开始计算。您可以向
comb\u calc
函数添加任何类型的逻辑。您认为可以将此代码改编为我的另一个问题吗?谢谢
df_overview <- df %>%
distinct(id) %>%
mutate(`2020-01` =
    case_when(id %in% df_2020_01 ~ 1,
    TRUE ~ 0))
  id 2020-01 2020-02 2020-03
  A        0       1       0
  B        1       0       1
  C        0       1       1