R语言 如何在函数中创建具有预定义前缀的新变量名

eyh26e7m  于 2022-12-30  发布在  其他
关注(0)|答案(2)|浏览(130)

我试图按年份来计算某个特定类型癌症的风险人群,我有一个data.table,它包含了患者是否患有cancer(1/0)的信息,以及他们的癌症被发现的日期cancerDate,我的数据跨度为2015年到2021年。
我已经为此编写了一个函数:

add_par_column <- function(dt, year) {
  dt[, `:=`(PAR = cancer == 0 | (cancer == 1 & cancerDate >= paste0(year, "-01-01")))]
}

然后像这样实现函数:

DT <- add_par_column(DT, 2015)
DT <- add_par_column(DT, 2016)
DT <- add_par_column(DT, 2017)
#etc.

问题是,我的函数创建的变量PAR会被我运行的year的每一个新行覆盖,而不是在data.table中单独保存每年的PAR。
我尝试过通过向PAR变量添加前缀来编辑函数,如下所示:

add_par_column <- function(dt, year) {
  dt[, `:=`(
    paste0("PAR", year) = cancer == 0 | (cancer == 1 & cancerDate >= paste0(year, "-01-01"))
    )]
}

但我一直收到错误消息。
如果我不使用这个函数,我应该在data.table中创建这些新的PAR变量:

DT <- DT[, 
                     `:=`(
                       PAR2015 = cancer == 0 |(cancer == 1 &  cancerDate >= "2015-01-01"),
                       PAR2016 = cancer == 0 |(cancer == 1 &  cancerDate >= "2016-01-01"),
                       PAR2017 = cancer == 0 |(cancer == 1 &  cancerDate >= "2017-01-01"),
                       PAR2018 = cancer == 0 |(cancer == 1 &  cancerDate >= "2018-01-01"),
                       PAR2019 = cancer == 0 |(cancer == 1 &  cancerDate >= "2019-01-01"),
                       PAR2020 = cancer == 0 |(cancer == 1 &  cancerDate >= "2020-01-01")
                       PAR2021 = cancer == 0 |(cancer == 1 &  cancerDate >= "2021-01-01")
                       )]

但我尽量避免重复。

alen0pnh

alen0pnh1#

如果我们希望保留PAR以保留原始数据并进行更新,则使用已创建的PAR列创建OR(|)条件

add_par_column <- function(dt, year) {
  if(!exists('PAR', dt))
    {
     dt[, PAR := FALSE]
    }
    dt[year(cancerDate) == year,  PAR := (cancer == 0 | 
                   (cancer == 1 & 
                    cancerDate >= paste0(year, "-01-01")))|PAR]
    dt
   
  
}
  • 测试
> add_par_column(DT, 2015)
> DT
    cancer cancerDate   PAR
 1:      0 2015-01-01  TRUE
 2:      0 2015-04-01  TRUE
 3:      1 2015-07-01  TRUE
 4:      0 2015-10-01  TRUE
 5:      1 2016-01-01 FALSE
 6:      0 2016-04-01 FALSE
 7:      0 2016-07-01 FALSE
 8:      1 2016-10-01 FALSE
 9:      1 2017-01-01 FALSE
10:      1 2017-04-01 FALSE
11:      1 2017-07-01 FALSE
12:      0 2017-10-01 FALSE
13:      1 2018-01-01 FALSE
14:      0 2018-04-01 FALSE
15:      1 2018-07-01 FALSE
16:      0 2018-10-01 FALSE
17:      1 2019-01-01 FALSE
18:      0 2019-04-01 FALSE
19:      0 2019-07-01 FALSE
20:      1 2019-10-01 FALSE
> add_par_column(DT, 2016)
> DT
    cancer cancerDate   PAR
 1:      0 2015-01-01  TRUE
 2:      0 2015-04-01  TRUE
 3:      1 2015-07-01  TRUE
 4:      0 2015-10-01  TRUE
 5:      1 2016-01-01  TRUE
 6:      0 2016-04-01  TRUE
 7:      0 2016-07-01  TRUE
 8:      1 2016-10-01  TRUE
 9:      1 2017-01-01 FALSE
10:      1 2017-04-01 FALSE
11:      1 2017-07-01 FALSE
12:      0 2017-10-01 FALSE
13:      1 2018-01-01 FALSE
14:      0 2018-04-01 FALSE
15:      1 2018-07-01 FALSE
16:      0 2018-10-01 FALSE
17:      1 2019-01-01 FALSE
18:      0 2019-04-01 FALSE
19:      0 2019-07-01 FALSE
20:      1 2019-10-01 FALSE

数据

set.seed(24)
DT <- data.table(cancer = sample(0:1, size = 20, replace = TRUE), 
   cancerDate = seq(as.Date('2015-01-01'), length.out = 20, by = '3 months'))
6tdlim6h

6tdlim6h2#

您可以使用LHS:=RHS引用语义来代替函数形式``:=(LHS=RHS)
我不记得看到函数形式与计算LHS,你得到的错误消息表明这是不允许的。

add_par_column <- function(dt, year) {
  dt[, paste0("PAR", year) := cancer == 0 | (cancer == 1 & cancerDate >= paste0(year, "-01-01"))]
}

DT <- add_par_column(DT, 2015)
DT <- add_par_column(DT, 2016)
DT <- add_par_column(DT, 2017)
DT[]

#    cancer cancerDate PAR2015 PAR2016 PAR2017
#     <int>     <Date>  <lgcl>  <lgcl>  <lgcl>
# 1:      0 2015-01-01    TRUE    TRUE    TRUE
# 2:      0 2015-04-01    TRUE    TRUE    TRUE
# 3:      1 2015-07-01    TRUE   FALSE   FALSE
# 4:      0 2015-10-01    TRUE    TRUE    TRUE
# 5:      1 2016-01-01    TRUE    TRUE   FALSE
...

相关问题