输入,处理和输出数据对

时间:2016-11-28 00:10:32

标签: r data.table

我们有一个包含药物管理数据的文本文件。每行包含患者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.

使用这种格式的输入文件,产生至少二十五个不同时间一起施用(即在同一天施用于同一患者)的药物对的列表。在上面的样本中,adderall和tylenol一起出现两次,但每隔一对出现一次。将每个符合条件的对输出为逗号分隔的元组,每行一个。

假设adderall-tylenol组合发生了50次并且tylenol-5FU组合发生了10次,输出文件应该如下所示:            吸毒频率     adderall-tylenol 50

请注意,因为tylenol-5FU组合发生的次数少于25次,所以最终输出中不会包含此内容。

2 个答案:

答案 0 :(得分:2)

使用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")

答案 1 :(得分:1)

您可以使用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