先前组中的多个值的指示符(时间序列)

时间:2014-09-08 23:34:07

标签: r data.table time-series

将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。

1 个答案:

答案 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