【发布时间】:2017-12-12 15:20:08
【问题描述】:
我有两个不同大小的数据集,其中包含人们服用两种不同药物的开始时间和停止时间。我想将它们结合起来,以便每次从任一数据集中显式包含两种药物使用的相应变量(0/1)。
示例数据:
library(dplyr)
set.seed(100)
df <- data.frame (id=c(1,1,1,1,2,2,2,3,3,3),
start=c(0,10,16,21,0,13,21,0,6,9),
stop=c(9,15,20,24,12,20,25,5,8,14),
drugA=rbinom(10,1,0.5))
df2 <- data.frame (id=c(1,1,2,2,3,3),
start=c(12,20,2,12,17,22),
stop=c(18,25,8,17,19,25),
drugB=c(1,1,1,1,1,1))
drugA/drugB 代表两种药物,其中 1 表示它们正在服用药物,0 表示没有服用。对于df2,对于未显示的任何时间意味着他们在此期间没有服用药物,例如id=1 在 0-12 时间不在 drugB 上。
我想要的结果数据集是:
finaldf<-structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L,
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L),
start = c(0L, 2L, 5L, 6L, 8L, 9L, 10L, 12L, 13L, 14L, 15L,
16L, 17L, 18L, 19L, 20L, 21L, 22L, 24L, 0L, 2L, 5L, 6L, 8L,
9L, 10L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L,
22L, 24L, 0L, 2L, 5L, 6L, 8L, 9L, 10L, 12L, 13L, 14L, 15L,
16L, 17L, 18L, 19L, 20L, 21L, 22L, 24L), stop = c(2L, 5L,
6L, 8L, 9L, 10L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L,
20L, 21L, 22L, 24L, 25L, 2L, 5L, 6L, 8L, 9L, 10L, 12L, 13L,
14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 24L, 25L, 2L,
5L, 6L, 8L, 9L, 10L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L,
20L, 21L, 22L, 24L, 25L), drugA = c(0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L,
1L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L), drugB = c(0L, 0L, 0L, 0L, 0L, 0L,
0L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 1L, 1L, 1L, 1L, 0L, 1L,
1L, 1L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L,
1L, 0L, 0L, 0L, 1L, 1L)), .Names = c("id", "start", "stop",
"drugA", "drugB"), class = "data.frame", row.names = c(NA, -57L
))
到目前为止,我尝试获取数据集的整体形状是:
t<-sort(unique(c(df$start,df$stop ,df2$start,df2$stop))) #list all the times
finaldf<-data.frame(id = rep(unique(df$id), each = length(t)))
finaldf$stop<-rep(t, each = length(finaldf))
finaldf<- finaldf %>%
group_by(id) %>%
mutate(start = lag(stop)) %>%
ungroup()
finaldf<-filter(finaldf,start>=0)
现在我想根据我遇到问题的两个数据集中的原始时间创建 drugA 和 drugB 变量。我尝试过使用dplyr 中的ifelse 语句通过id 来执行此操作的尴尬尝试,但我显然正在使用不同大小的数据集,所以不确定这是否是正确的方法?
finaldf<-finaldf %>% group_by(id) %>%
mutate(drugA=ifelse(df$drugA==1 & df$start>=finaldf$start & df$stop<=finaldf$stop ,1,0),
drugB=ifelse(df2$drugB==1 & df2$start>=finaldf$start & df2$stop<=finaldf$stop ,1,0)) %>% ungroup()
任何帮助将不胜感激。谢谢
【问题讨论】:
-
你最后想要什么?所以请包括您的预期输出。
-
我已经在上面的代码中给出了我想要的最终数据集,参见上面的
structure(list..。在运行边际结构模型时,我需要 drugA 和 drugB 的时变变量。
标签: r if-statement dataframe dplyr