如何基于应用于数据集的月份序列来创建以月份和年份命名的虚拟变量?

时间:2019-06-27 15:03:46

标签: r lubridate

我正在按月计算885.630例患者数据集中一组慢性病的患病率。每个患者都有三个主要信息:(1)df $ min,数据集中首次出现的日期; (2)df $ max-数据集中的最后出现;以及(3)df $ HBP,例如患者被诊断出患有高血压的日期。这三个变量都是日期。我使用lubridate :: interval函数创建了另一个名为df $ interval的变量,将df $ min和df $ max组合在一起,使我只能在该时间段内使用考虑患者的分子。每个患者都有特定的df $ min和df $ max,这会给计算每82个月的患病率带来一定麻烦,因为分子和分母每个新月都会变化,而且仅在一段时间内必须将患者视为“案例”从df $ condition直到该特定患者的df $ max。

我已经通过每82个月创建一个虚拟变量来解决问题的第一部分,这将使我能够计算出患病率,但是我敢肯定,除了重复同一行82次外,还有一种更简便的方法代码。


library(lubridate)
HBP <- as.Date(c(NA, NA, "2013-08-01", NA, "2017-11-01", NA, NA, NA, NA, NA))

min <- as.Date(c("2017-05-19", "2013-03-27", "2013-08-01", "2013-04-24", "2013-05-08", 
                 "2013-03-21","2013-04-08","2013-08-01","2016-09-12", "2016-06-13"))

max <- as.Date(c("2017-05-19","2014-09-12","2018-09-24","2013-04-24","2018-07-31",
                 "2018-04-17","2018-04-11","2017-02-07","2016-09-12", "2016-06-13"))

df <- data.frame(HBP, min, max)

month <- round_date(seq.Date(as.Date("2012-02-02"), as.Date("2018-11-08"), by = "months"), "month") # those are the min and max values of consultations in the dataset.


df$interval <- interval(df$min, df$max)

df$month1 <- month[1] %within% df$interval
df$month2 <- month[2] %within% df$interval
# repeat 82 times - here is my first issue: Is there am easier way to do it?
df$month65 <- month[65] %within% df$interval



结果是,虚拟变量显示为TRUE(患者将在该月份使用分母)或FALSE。它正在工作,但是我仍然有一些问题:

  1. 创建这些变量“ month1”,“ month2”,“ monthn”的简单方法是什么?

  2. 是否有一种简单的方法来计算每个月的患病率而无需创建每个月的虚拟人?结果将是一个数据框,其中包含82行(每月一个)和列,其中每种慢性病的患病率都很高。

1 个答案:

答案 0 :(得分:0)

这只能部分回答您的问题。您可以按以下方式创建月份的虚拟列:

dummies <- lapply(month, function(x) {x %within% df$interval})
dummies <- as.data.frame(matrix(unlist(dummies), ncol = length(month)))
colnames(dummies) <- paste0("month", 1:length(month))
df <- cbind(df, dummies)