将data.table与数据结构结合使用,如:
library(data.table)
set.seed(12345)
dt <- data.table(id = c(rep('A',6),rep('B',3),rep('C',5),'D'),
day = c(rep(11:15,3)),
drug = sample(LETTERS[4:6], 15, replace = TRUE))
setkey(dt,'id','day')
结果data.table dt
:
id day drug
1: A 11 F
2: A 11 D
3: A 12 F
4: A 13 F
5: A 14 F
6: A 15 E
7: B 12 D
8: B 13 E
9: B 14 F
10: C 11 D
11: C 12 D
12: C 13 F
13: C 14 D
14: C 15 F
15: D 15 E
我正在尝试生成一个逻辑变量,用于描述每个主题(由id
表示)是否在从当前drug
到2的时间间隔内> 1 day
上在当前观察之前day
。
因此,所需的修改data.table将是:
id day drug poly
1: A 11 F TRUE
2: A 11 D TRUE
3: A 12 F TRUE
4: A 13 F TRUE
5: A 14 F FALSE
6: A 15 E TRUE
7: B 12 D FALSE
8: B 13 E TRUE
9: B 14 F TRUE
10: C 11 D FALSE
11: C 12 D FALSE
12: C 13 F TRUE
13: C 14 D TRUE
14: C 15 F TRUE
15: D 15 E FALSE
我没有和data.table
结合,但我正在处理非常大的数据(大约23M行),所以解决方案必须是内存效率或我最大化RAM。
答案 0 :(得分:1)
可能有更好的,更data.table
中心的方式,但这有效:
dt[,
poly := sapply(
lapply(day, function(y) (y - day) %in% 0:2),
function(z) length(unique(drug[z])) > 1),
by=id
]
# id day drug poly
# 1: A 9 F TRUE
# 2: A 9 D TRUE
# 3: A 10 F TRUE
# 4: A 11 F TRUE
# 5: A 12 F FALSE
# 6: A 13 E TRUE
# 7: B 10 D FALSE
# 8: B 11 E TRUE
# 9: B 12 F TRUE
#10: C 9 D FALSE
#11: C 10 D FALSE
#12: C 11 F TRUE
#13: C 12 D TRUE
#14: C 13 F TRUE
#15: D 13 E FALSE