基于R中其他数据集的条件创建变量

基于R中其他数据集的条件创建变量,r,mutate,R,Mutate,我试图根据其他数据集的条件创建变量。我有两个数据集,A和B A是一段时间内患者的状态寄存器。它是按天登记的B是患者是否接受治疗的时间表 我想创建一个变量,指示患者是否在基于时间表的数据集中接受了治疗,即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(

我试图根据其他数据集的条件创建变量。我有两个数据集,
A
B

A
是一段时间内患者的状态寄存器。它是按天登记的<代码>B是患者是否接受治疗的时间表

我想创建一个变量,指示患者是否在基于时间表的数据集中接受了治疗,即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接受治疗直到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
我用
mutate
函数尝试了
dplyr

A%>%mutate(
treat=
case_when(
ID==B$ID & B$onset <= start & start < B$end ~ B$treat,
TRUE~0)
A%>%变异(
对待=
什么时候(

ID==B$ID&B$start我们可以使用来自
数据表的非等联接

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
库(data.table)
setDT(A)[B,treat:=treat,on=。(ID,start>=start,stop
A\u%

过滤器(开始>=开始,停止我们可以使用模糊连接:

fuzzyjoin::fuzzy_left_join(A, B, 
                       by = c('ID' = 'ID', 'start' = 'onset', 'stop' = 'end'), 
                       match_fun = list(`==`, `>=`, `<=`))


#   ID.x start stop ID.y onset end treat
#1     X     0    1    X     0   5     1
#2     X     1    2    X     0   5     1
#3     X     2    3    X     0   5     1
#4     X     3    4    X     0   5     1
#5     X     4    5    X     0   5     1
#6     X     5    6    X     5  10     0
#7     X     6    7    X     5  10     0
#8     X     7    8    X     5  10     0
#9     X     8    9    X     5  10     0
#10    X     9   10    X     5  10     0
#11    X    10   11    X    10  15     1
#12    X    11   12    X    10  15     1
#13    X    12   13    X    10  15     1
#14    X    13   14    X    10  15     1
#15    X    14   15    X    10  15     1
#....
#...
fuzzyjoin::fuzzy_left_join(A,B,
by=c('ID'='ID','start'='start','stop'='end'),

match_fun=list(`=`,`>=`,`你不需要
treat:=treat
@r2evans'A'没有'treat'列好的……但是试试看。
setDT(A)[B,on=。(ID,start>=start,stop@r2evans是的,这也行。我在想,如果OP在'B'中有其他列,那么我们就不需要创建额外的输出。另外,通过
:=
,我们正在更新
A
对象
A_merged <- left_join(A, B) %>% 
  filter(start >= onset, stop <= end) 

head(A_merged, 15)

# A tibble: 15 x 6
   ID    start  stop onset   end treat
   <fct> <int> <int> <dbl> <dbl> <dbl>
 1 X         0     1     0     5     1
 2 X         1     2     0     5     1
 3 X         2     3     0     5     1
 4 X         3     4     0     5     1
 5 X         4     5     0     5     1
 6 X         5     6     5    10     0
 7 X         6     7     5    10     0
 8 X         7     8     5    10     0
 9 X         8     9     5    10     0
10 X         9    10     5    10     0
11 X        10    11    10    15     1
12 X        11    12    10    15     1
13 X        12    13    10    15     1
14 X        13    14    10    15     1
15 X        14    15    10    15     1
fuzzyjoin::fuzzy_left_join(A, B, 
                       by = c('ID' = 'ID', 'start' = 'onset', 'stop' = 'end'), 
                       match_fun = list(`==`, `>=`, `<=`))


#   ID.x start stop ID.y onset end treat
#1     X     0    1    X     0   5     1
#2     X     1    2    X     0   5     1
#3     X     2    3    X     0   5     1
#4     X     3    4    X     0   5     1
#5     X     4    5    X     0   5     1
#6     X     5    6    X     5  10     0
#7     X     6    7    X     5  10     0
#8     X     7    8    X     5  10     0
#9     X     8    9    X     5  10     0
#10    X     9   10    X     5  10     0
#11    X    10   11    X    10  15     1
#12    X    11   12    X    10  15     1
#13    X    12   13    X    10  15     1
#14    X    13   14    X    10  15     1
#15    X    14   15    X    10  15     1
#....
#...