【问题标题】:How to create dummie variables named by month and year based on a sequence of months applied over a dataset?如何根据应用于数据集的月份序列创建按月份和年份命名的虚拟变量?
【发布时间】:2019-06-27 15:03:46
【问题描述】:

我在 885.630 名患者的数据集中按月计算一组慢性病的患病率。每个患者都有三个主要信息:(1)df$min,第一次出现在数据集中的日期; (2) df$max - 最后一次出现在数据集中; (3) df$HBP,例如患者被诊断为高血压的日期。所有三个变量都是日期。我使用结合 df$min 和 df$max 的 lubridate::interval 函数创建了另一个名为 df$interval 的变量,以允许我仅在该时间段内使用分母中的患者。每个患者都有特定的 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 行(每个月一个)和列的数据框,其中包含每种慢性病的患病率。

【问题讨论】:

    标签: r lubridate


    【解决方案1】:

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

    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)
    

    【讨论】:

    • 谢谢你,弗拉维亚。您的建议确实解决了第一个问题。有了它,我能够对每种慢性病进行“汇总”,并创建一个数据集,其中每个月的行和每个慢性病的一列。 condition1 &lt;- c(colSums(dummiescondition1, na.rm = TRUE)),产生一个数据框,如df &lt;- data.frame(month, pacient, condition1, condition2)。非常感谢!
    • 不客气,阿德尔森!现在我变得更好了,你想做什么。您可以将其简化很多,直接在我的第一行代码的函数上添加sum 以直接计算“条件”的值:condition &lt;- lapply(month, function(x) {sum(x %within% df$interval)})
    • 它绝对有效。最后,rbind.data.frame 有助于构建最终的 df。你节省了很多代码行;)
    • 很高兴它有效!我建议你检查mapply,以防你想在不同条件下对多个df进行分析。
    猜你喜欢
    • 2014-09-07
    • 1970-01-01
    • 2019-12-06
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多