r - 根据条件与 R 中的其他数据集创建变量
问题描述
我正在尝试根据其他数据集的条件创建变量。我有两个数据集,A
和B
.
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)
但它返回错误。因为两个数据集的行数不相等。
如何解决这个问题呢?
解决方案
我们可以使用非 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
推荐阅读
- antd - 蚂蚁设计精选。模糊后不清除搜索值
- c# - 输出参数 totalCount 和行 SYS_REFCURSOR Oracle
- database-design - 在 SQL 中维护多个数据提供者和迁移方法
- r - 如何数“?” 在来自 openML 的数据集中的 R 中
- java - 在调度程序中监控单个作业让我们说 Quartz
- powershell - 如何使用 PowerShell 利用 Defender for Endpoint Rest API 将变量传递给高级搜索查询
- arrays - 如何在 MATLAB 中使用 rmoutliers() 保存输入形状插入数据?
- git - 是否有 git 工作流程来描述这种情况?
- progressive-web-apps - PWA 显示地址栏:使用自定义安装按钮通过网络链接安装
- sql - 检查整数是否介于二维数组列的任何整数对之间