【问题标题】:Input, Process, and Output pairs of data输入、处理和输出数据对
【发布时间】:2016-11-28 00:10:32
【问题描述】:

我们有一个包含药物管理数据的文本文件。每行包含一个患者 ID、一个给药日期和一个药物名称,格式如下:

A234,2014-01-01,5FU
A234,2014-01-02,adderall
B324,1990-06-01,adderall
A234,2014-01-02,tylenol
B324,1990-06-01,tylenol
...etc.

使用此格式的输入文件,生成至少 25 次不同时间一起给药(即在同一天对同一患者给药)的成对药物列表。在上面的示例中,adderall 和 tylenol 一起出现了两次,但每隔一对只出现一次。将每个符合条件的对输出为逗号分隔的元组,每行一个。

假设adderall-tylenolcombination 出现了 50 次,tylenol-5FU 组合出现了 10 次,输出文件应该如下所示: 用药频率 adderall-tylenol 50

请注意,由于tylenol-5FU 组合出现的次数少于 25 次,因此它不包含在最终输出中。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    使用library(data.table) 我们可以做到

    dt[, paste(drug, collapse = '-'), by = .(id,date)]
    #      id       date               V1
    # 1: A234 2014-01-01              5FU
    # 2: A234 2014-01-02 adderall-tylenol
    # 3: B324 1990-06-01 adderall-tylenol
    

    虽然这也包括药物组合不是元组的 id-date 组合。如果您只想拥有正好有两种药物的行,那么我们为此添加一个测试:

    dt[, if (.N == 2) paste(drug, collapse = '-'), by = .(id,date)]
    #      id       date               V1
    # 1: A234 2014-01-02 adderall-tylenol
    # 2: B324 1990-06-01 adderall-tylenol
    

    为了将这些结果进一步细分到仅在不同日期应用药物组合超过 25 次的患者,我们可以将结果链接到另一个测试:

    dt[, if (.N == 2) paste(drug, collapse = '-'), by = .(id,date)][, if (.N>25) .(date,V1), by=id]
    

    如果需要,您可以使用 write.table 将这些结果写入新文件

    数据

    dt = fread("id, date, drug
    A234,2014-01-01,5FU
    A234,2014-01-02,adderall
    B324,1990-06-01,adderall
    A234,2014-01-02,tylenol
    B324,1990-06-01,tylenol")
    

    【讨论】:

    • @ProvisionalModulation 请注意,我在您接受答案后编辑了最后一部分(检查 > 25 次)。您应该使用现在的代码,以防您没有注意到更新。
    【解决方案2】:

    您可以使用dplyr 库来汇总数据表。

    library(dplyr)
    
    data = data.frame(id = c("A234","A234", "B324", "A234","B324"),
                      date = strptime(c("2014-01-01","2014-01-02", "1990-06-01", "2014-01-02", "1990-06-01"),
                                      format = "%Y-%m-%d"),
                      drug = c("5FU", "adderall", "adderall", "tylenol", "tylenol"))
    
    data %>%
      group_by(id, date) %>%
      summarise(drug_used = paste(drug,collapse = "-"))
    
    Source: local data frame [3 x 3]
    Groups: id [?]
    
          id       date        drug_used
      <fctr>     <dttm>            <chr>
    1   A234 2014-01-01              5FU
    2   A234 2014-01-02 adderall-tylenol
    3   B324 1990-06-01 adderall-tylenol
    

    【讨论】:

    • 能否调整代码以使最终输出包含出现 25 次或更多的 drug_used 组合?也就是说,原始数据包含50个adderall-tylenol组合和15个adderall-5FU组合,但最终输出只包含adderall-tylenol组合。
    • 请提供一些示例数据,以便我们重现并解决您的其他问题。
    • 另外,你的意思是你想有一个drug_used 列来包含出现25次或更多次的组合,而让其他单元格不适用?还是要添加 T/F 列来测试是否满足您的条件?
    猜你喜欢
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 2015-12-27
    • 1970-01-01
    • 2022-12-10
    • 2017-11-29
    相关资源
    最近更新 更多