R 函数对变量上的表达式求值,并用逻辑

R 函数对变量上的表达式求值,并用逻辑,r,R,df1(以下)是一个事件日志。变量1由(非唯一)时间戳(POSIXCt)组成。变量2:4由事件(因子)的属性组成 我创建了df2和df3来定义时间容器。df2存储每个时间段的初始时间,df3存储每个时间段的结束时间 问题是如何使用变量名df2(与df3相同)展开df1,同时根据事件是否属于该变量的某个时间段,为每个事件填写TRUE或FALSE。 换句话说,若事件属于时间段(由df2和df3定义),则该值为TRUE,否则为FALSE。 df1中的每个事件都需要对照所有时间段(df2和DF3的所有元

df1(以下)是一个事件日志。变量1由(非唯一)时间戳(POSIXCt)组成。变量2:4由事件(因子)的属性组成

我创建了df2和df3来定义时间容器。df2存储每个时间段的初始时间,df3存储每个时间段的结束时间

问题是如何使用变量名df2(与df3相同)展开df1,同时根据事件是否属于该变量的某个时间段,为每个事件填写TRUE或FALSE。
换句话说,若事件属于时间段(由df2和df3定义),则该值为TRUE,否则为FALSE。 df1中的每个事件都需要对照所有时间段(df2和DF3的所有元素对)进行检查,每次检查一个变量(df2和DF3)

由于有大量变量和事件,我无法以交互方式执行此操作。 但是我想学习如何用R方式来做,避免显式for循环,并利用矢量化

数据(小样本数据集)


非常感谢您的指点。谢谢

您可以使用包数据中的
foverlaps
。表:

library(reshape2)
df2 <- melt(df2, value.name = "start")
df3 <- melt(df3, value.name = "end")
df2$end <- df3$end

library(data.table)
setDT(df1)
setDT(df2)

df1[, time.stamp2 := time.stamp]

setkey(df2, start, end)
res <- df2[, foverlaps(df1, .SD, 
                by.x = c("time.stamp", "time.stamp2"),
                by.y = c("start", "end"),
                type = "start")[,list(time.stamp, g.id, match = !is.na(start))], 
    by = variable]
res[, id := seq_len(.N), by = variable]

dcast(res, id + time.stamp + g.id ~ variable, value.var = "match")
#   id          time.stamp g.id  m0p1  m1p1  m2p1  m3p1
# 1  1 2015-01-05 15:00:00  848  TRUE FALSE FALSE FALSE
# 2  2 2015-01-05 15:01:00  737 FALSE  TRUE FALSE FALSE
# 3  3 2015-01-05 15:02:00  848 FALSE FALSE  TRUE FALSE
# 4  4 2015-01-05 15:02:00  848 FALSE FALSE  TRUE FALSE
# 5  5 2015-01-05 15:03:00  737 FALSE FALSE FALSE  TRUE
# 6  6 2015-01-05 15:03:00  848 FALSE FALSE FALSE  TRUE
# 7  7 2015-01-05 15:03:00  737 FALSE FALSE FALSE  TRUE
# 8  8 2015-01-05 15:03:00  737 FALSE FALSE FALSE  TRUE
library(重塑2)

谢谢你,罗兰。为了编写好文档,我已经修复了预期的输出,因为它有一个不精确性,感谢您指出out.argument type=“start”,如上例所示,将不会像预期的那样工作,因为如果a==c,结果为真(真是间隔或值等于参考间隔的开始时间)。要标识引用间隔内的间隔(或值),请使用:type==“in”。
> head(df1.extended)
          time.stamp  g.id  m0p1   m1p1   m2p1   m3p1
1 2015-01-05 15:00:00  848  TRUE   FALSE  FALSE  FALSE
2 2015-01-05 15:01:00  737  FALSE  TRUE   FALSE  FALSE 
3 2015-01-05 15:02:00  848  FALSE  FALSE  TRUE   FALSE
4 2015-01-05 15:02:00  848  FALSE  FALSE  TRUE   FALSE
5 2015-01-05 15:03:00  737  FALSE  FALSE  FALSE  TRUE
6 2015-01-05 15:03:00  848  FALSE  FALSE  FALSE  TRUE
7 2015-01-05 15:03:00  737  FALSE  FALSE  FALSE  TRUE
8 2015-01-05 15:03:00  848  FALSE  FALSE  FALSE  TRUE
library(reshape2)
df2 <- melt(df2, value.name = "start")
df3 <- melt(df3, value.name = "end")
df2$end <- df3$end

library(data.table)
setDT(df1)
setDT(df2)

df1[, time.stamp2 := time.stamp]

setkey(df2, start, end)
res <- df2[, foverlaps(df1, .SD, 
                by.x = c("time.stamp", "time.stamp2"),
                by.y = c("start", "end"),
                type = "start")[,list(time.stamp, g.id, match = !is.na(start))], 
    by = variable]
res[, id := seq_len(.N), by = variable]

dcast(res, id + time.stamp + g.id ~ variable, value.var = "match")
#   id          time.stamp g.id  m0p1  m1p1  m2p1  m3p1
# 1  1 2015-01-05 15:00:00  848  TRUE FALSE FALSE FALSE
# 2  2 2015-01-05 15:01:00  737 FALSE  TRUE FALSE FALSE
# 3  3 2015-01-05 15:02:00  848 FALSE FALSE  TRUE FALSE
# 4  4 2015-01-05 15:02:00  848 FALSE FALSE  TRUE FALSE
# 5  5 2015-01-05 15:03:00  737 FALSE FALSE FALSE  TRUE
# 6  6 2015-01-05 15:03:00  848 FALSE FALSE FALSE  TRUE
# 7  7 2015-01-05 15:03:00  737 FALSE FALSE FALSE  TRUE
# 8  8 2015-01-05 15:03:00  737 FALSE FALSE FALSE  TRUE