我们有一个包含药物管理数据的文本文件。每一行都包含一个病人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-tylenol组合发生了50次,tylenol-5FU组合发生了10次,输出文件应该如下所示: drug_used frequency tylenol 50
注意,由于tylenol-5FU组合发生的次数少于25次,所以最终输出中没有包含它。
发布于 2016-11-28 01:08:52
使用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-日期组合,其中药物组合不是元组。如果你只想有两种药物,那么我们增加一个测试:
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")发布于 2016-11-28 00:58:01
可以使用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-tylenolhttps://stackoverflow.com/questions/40835432
复制相似问题