基于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,stopA\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
#....
#...