首页 > 解决方案 > 根据条件与 R 中的其他数据集创建变量

问题描述

我正在尝试根据其他数据集的条件创建变量。我有两个数据集,AB.

A是患者随时间的状态寄存器。它按天注册。B是安排患者是否接受治疗。

我想创建变量,指示患者是否根据时间表在 A 数据集中接受治疗,即 B 数据集。

例如,我有 3 个患者,“X”、“Y”和“Z”。

start是观察开始的那一天,是观察stop结束的那一天。

数据集A如下。

A<-data.frame(ID=c(rep("X",15),rep("Y",10),rep("Z",20)),
              start=c(seq(0,14),seq(0,9),seq(0,19)),
              stop=c(seq(1,15),seq(1,10),seq(1,20)))

head(A,15)

   ID start stop
1   X     0    1
2   X     1    2
3   X     2    3
4   X     3    4
5   X     4    5
6   X     5    6
7   X     6    7
8   X     7    8
9   X     8    9
10  X     9   10
11  X    10   11
12  X    11   12
13  X    12   13
14  X    13   14
15  X    14   15

在该数据中,X 被观察到从登记开始的 15 天。onset是治疗开始end的日子,是治疗结束的日子。

B是治疗计划

B<-data.frame(ID=c(rep("X",3),rep("Y",2),rep("Z",4)),
              onset=c(seq(0,10,by=5),seq(0,5,by=5),seq(0,15,by=5)),
              end=c(seq(5,15,by=5),seq(5,10,by=5),seq(5,20,by=5)),
              treat=c(1,0,1,1,1,0,0,1,1))

head(B,3)

  ID onset end treat
1  X     0    5     1
2  X     5   10     0
3  X    10   15     1

因此,X 接受了 5 天的治疗。5 天后,X 未接受治疗,10 天后,X 再次接受治疗。所以,A 将是

head(A,15)

   ID start stop treat
1   X     0    1    1
2   X     1    2    1
3   X     2    3    1
4   X     3    4    1
5   X     4    5    1
6   X     5    6    0
7   X     6    7    0
8   X     7    8    0
9   X     8    9    0
10  X     9   10    0
11  X    10   11    1
12  X    11   12    1
13  X    12   13    1
14  X    13   14    1
15  X    14   15    1

我尝试dplyr了功能包mutate

A%>%mutate(
treat=
case_when(
ID==B$ID & B$onset <= start & start < B$end ~ B$treat,
TRUE~0)

但它返回错误。因为两个数据集的行数不相等。

如何解决这个问题呢?

标签: rdplyr

解决方案


我们可以使用非 equi 连接data.table

library(data.table)
setDT(A)[B, treat := treat, on = .(ID, start >= onset,  stop <= end)]
head(A, 15)
#    ID start stop treat
# 1:  X     0    1     1
# 2:  X     1    2     1
# 3:  X     2    3     1
# 4:  X     3    4     1
# 5:  X     4    5     1
# 6:  X     5    6     0
# 7:  X     6    7     0
# 8:  X     7    8     0
# 9:  X     8    9     0
#10:  X     9   10     0
#11:  X    10   11     1
#12:  X    11   12     1
#13:  X    12   13     1
#14:  X    13   14     1
#15:  X    14   15     1

推荐阅读