根据时间段计算另外 2 个事件之间的发生次数🙋:女标志:你好!
在“子类型”列中,仅当第二次 REM 出现的“开始”列中的时间在 15 分钟内时,我需要计算“Stadium N2”在两次出现“REM”之间出现的次数。第一次 REM 发生的“结束”列中的时间。
请参阅屏幕截图中的星星:在本例中,计数将为 3
这样做的公式是什么?
谢谢:拥抱脸: :双手合十:
自动化和脚本编写苹果系统回复:根据时间段计算其他 2 个事件之间的发生次数您能否提供示例数据以使测试更容易?
回复:根据时间段计算其他 2 个事件之间的发生次数给你!
回复:根据时间段计算另外 2 个事件之间的发生次数还有一个问题,累计值可以吗? 那么,在两个 REM 之间的第一个 Stadium N2 上,它将是 1,第二个是 2,依此类推?
回复:根据时间段计算另外 2 个事件之间的发生次数这绝对不是唯一的选择,但根据您拥有的数据量,当您向表中添加两列时,类似的方法可能会起作用
Names Default To Here(1);
Current Data Table() << New Column("R", Numeric, Continuous, Formula(
Col Cumulative Sum(If(:SubType == "REM", 1, .))
));
Current Data Table() << New Column("c_n2", Numeric, Continuous, Formula(
If(!IsMissing(:R),
Col Sum(If(:SubType == "Stadium N2", 1, 0), :R);
,
.
);
));
回复:根据时间段计算另外 2 个事件之间的发生次数谢谢你的建议,这确实将所有 N2 间歇性识别为 REM 
然而,我只需要计算 2 个 REM 之间的时间间隔,最长间隔为 15 分钟(大多数 REM 结束时间和随后的 REM 开始时间相距 > 15 分钟)。
您将如何集成这个时间过滤器?
回复:根据时间段计算另外 2 个事件之间的发生次数数据应该如何排序? 例如,我们在下一个结束之前有第一个 REM 结束?

或者数据是否已正确排序(我刚刚将此处的格式更改为日期时间)? 我们缺少日期信息,那么如何区分日期何时变化,或者我们应该根据时间戳进行猜测?

编辑:遵循数据的原始顺序,只关心检查结束和下一个开始
Names Default To Here(1);
dt = Open("$DOWNLOADS/example(1).jmp");
m_sub = dt[0, "SubType"];
rem_rows = Loc(m_sub, "REM");
rem_ends = dt[rem_rows, "Time of Day[End]"];
rem_starts = dt[rem_rows, "Time of Day[Start]"];
Remove From(rem_ends, N Items(rem_starts));
Remove From(rem_starts, 1);
rem_durs = (rem_starts - rem_ends);
new_col = dt << New Column("Counts", Numeric, Continuous);
For Each({rem_dur, idx}, rem_durs,
If(rem_dur < In Minutes(15) & rem_dur >= 0,
row_start = rem_rows[idx];
row_end = rem_rows[idx + 1];
ntwos = Loc(m_sub[row_start::row_end], "Stadium N2");
ntwo_count = N Items(ntwos);
dt[row_start::row_end, "Counts"] = ntwo_count;
);
);
回复:根据时间段计算其他 2 个事件之间的发生次数谢谢你! 值确实已由 Start 排序。
小附加问题:我需要手动验证正确性,但只能在按其他列分组后执行此操作:ID、:Validated、:Subtype
我将在哪里以及如何适合分组依据?
回复:根据时间段计算其他 2 个事件之间的发生次数添加分组变量需要对脚本进行大量更改。 最简单的选择很可能是为每个组添加创建子集,对这些组运行计算,然后将它们连接回原始数据表(可能需要添加某种唯一标识符列)。 另一种相当简单的选择是创建单个 GROUP 列,然后使用该列循环不同的选项,但必须小心索引。