我们有一个包含药物管理数据的文本文件。每行包含患者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次,所以最终输出中不会包含此内容。
答案 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