生效日期:

DT<-data.table::data.table(
          ID = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L),
       C_OPR = c("ABCD01", "ABCD11", NA, "EFGH", NA, NA, "KLMN", NA),
       D_OPR = c(NA, NA, "PQRST", NA, "EFGHIJ", NA, NA, NA),
        DATE = c("2007-07-07","2005-05-05","2002-02-02",
                 "2002-02-02","2004-04-04",NA,"2001-01-01",NA),
   INDX_DATE = c("2006-06-06","2006-06-06","2006-06-06",
                 "2001-01-01","2001-01-01","2001-01-01","2005-05-05",
                 "2005-05-05")
)

ALFA_DEF<-c("ABCD","EFGH")

输出:

   ID  C_OPR  D_OPR       DATE  INDX_DATE
1:  1 ABCD01   <NA> 2007-07-07 2006-06-06
2:  1 ABCD11   <NA> 2005-05-05 2006-06-06
3:  1   <NA>  PQRST 2002-02-02 2006-06-06
4:  2   EFGH   <NA> 2002-02-02 2001-01-01
5:  2   <NA> EFGHIJ 2004-04-04 2001-01-01
6:  2   <NA>   <NA>       <NA> 2001-01-01
7:  3   KLMN   <NA> 2001-01-01 2005-05-05
8:  3   <NA>   <NA>       <NA> 2005-05-05

请注意,情况并非如此.

   ID  C_OPR  D_OPR       DATE  INDX_DATE ALFA
1:  1 ABCD01   <NA> 2007-07-07 2006-06-06    1
2:  1 ABCD11   <NA> 2005-05-05 2006-06-06    1
3:  1   <NA>  PQRST 2002-02-02 2006-06-06    1
4:  2   EFGH   <NA> 2002-02-02 2001-01-01    0
5:  2   <NA> EFGHIJ 2004-04-04 2001-01-01    0
6:  2   <NA>   <NA>       <NA> 2001-01-01    0
7:  3   KLMN   <NA> 2001-01-01 2005-05-05    0
8:  3   <NA>   <NA>       <NA> 2005-05-05    0

逻辑:

包含ALFA_DEF的任何C_OPRD_OPR,其中DATE小于INDX_DATE-在同一组(ID)中,生成ALFA=1,否则为0.

不更正日期的try :

DT[, ALPHA := +any( grepl(paste0(ALPHA_DEF, collapse="|"),c(D_OPR, C_OPR)), by=ID]

最好是data.table解决方案,但也欢迎dplyr.

♪H♪

推荐答案

我们可以这样做:

在创建新列ALFA之后 我们判断是否 A)任何C_OPRD_OPR都等于ALFA_DEF B)DATE<;INDX_DATE 那么ALFA就是1 否则ALFA就是0

DT[, ALFA := ifelse(any(grepl(paste0(ALFA_DEF, collapse = "|"), c(D_OPR, C_OPR)) & as.Date(DATE) < as.Date(INDX_DATE)), 1, 0), by = ID]

输出:

   ID  C_OPR  D_OPR       DATE  INDX_DATE ALFA
1:  1 ABCD01   <NA> 2007-07-07 2006-06-06    1
2:  1 ABCD11   <NA> 2005-05-05 2006-06-06    1
3:  1   <NA>  PQRST 2002-02-02 2006-06-06    1
4:  2   EFGH   <NA> 2002-02-02 2001-01-01    0
5:  2   <NA> EFGHIJ 2004-04-04 2001-01-01    0
6:  2   <NA>   <NA>       <NA> 2001-01-01    0
7:  3   KLMN   <NA> 2001-01-01 2005-05-05    0
8:  3   <NA>   <NA>       <NA> 2005-05-05    0

R相关问答推荐

在数据表中呈现数学符号

如果行和列名以相同的开头,将矩阵值设置为0

基于shiny 应用程序中的日期范围子集xts索引

对lme 4对象运行summary()时出错(diag中的错误(from,names = RST):对象unpackedMatrix_diag_get找不到)

无法将传奇添加到cowplot多情节中

带有叠加饼图系列的Highmap

将数据集中的值增加到当前包含的最大值

将. xlsx内容显示为HTML表

使用data.table::fcase()而不是dplyr::case_When()时保持值

使用rvest从多个页面抓取时避免404错误

来自程序包AFEX和amp;的类/函数和NICE_TABLE&冲突

如何使用字符串从重复的模式中提取多个数字?

将列表中的字符串粘贴到R中for循环内的dplyr筛选器中

以任意顺序提取具有多个可能匹配项的组匹配项

网络抓取新闻标题和时间

对R中的列表列执行ROW Mean操作

如何在AER::ivreg中指定仪器?

如何将宽格式的患者信息数据高效地转换为患者计数的时间序列?

在使用SliderInput In Shiny(R)设置输入数据的子集时,保留一些情节痕迹

如果极点中存在部分匹配,则替换整个字符串