按组使用data.table的shift()产生意外结果(错误?)

Ben

考虑这个数据集

数据

dt <- data.table(ID = c(1,8,9,20,32,33), Char = c("A", "A", "B", "B", "C", "C"))
dt
   ID Char
1:  1    A
2:  8    A
3:  9    B
4: 20    B
5: 32    C
6: 33    C

我想通过ID来标识“运行”,即ID相差1的连续行,但我只想考虑同一Char组中的运行我可以这样做

正确的

dt[, InRun := FALSE]
dt[, DistToAbove := abs(ID - shift(ID, type="lag")), by=Char]
dt[, DistToBelow := abs(ID - shift(ID, type="lead")), by=Char]
dt[DistToAbove <= 1 | DistToBelow <= 1, InRun := TRUE, by=Char]
dt
   ID Char InRun DistToAbove DistToBelow
1:  1    A FALSE          NA           7
2:  8    A FALSE           7          NA
3:  9    B FALSE          NA          11
4: 20    B FALSE          11          NA
5: 32    C  TRUE          NA           1
6: 33    C  TRUE           1          NA

我尝试将上面的代码简化为以下几行,但答案有所不同

错误/意外

dt[, InRun := FALSE]
dt[abs(ID - shift(ID, type="lag")) <= 1 | abs(shift(ID, type="lead") - ID) <= 1, InRun := TRUE, by=Char]
dt
   ID Char InRun DistToAbove DistToBelow
1:  1    A FALSE          NA           7
2:  8    A  TRUE           7          NA
3:  9    B  TRUE          NA          11
4: 20    B FALSE          11          NA
5: 32    C  TRUE          NA           1
6: 33    C  TRUE           1          NA

是什么赋予了?(请注意,我正在使用data.table v1.9.7)

坦率

我想通过ID来标识“运行”,即ID相差1的连续行,但我只想考虑同一Char组中的运行。

这是我的处理方法:

dt[, run_id := cumsum(
  ( ID != shift(ID, fill = ID[1L]) + 1L )
  |
  ( Char != shift(Char, fill = Char[1L]) )
)]
dt[, in_run := .N > 1L, by=.(Char, run_id)]

   ID Char run_id in_run
1:  1    A      1  FALSE
2:  8    A      2  FALSE
3:  9    B      3  FALSE
4: 20    B      4  FALSE
5: 32    C      5   TRUE
6: 33    C      5   TRUE

此代码标识所有运行(包括长度为一的运行),然后测试长度大于一的运行(OP的定义)。


关于OP的方法:

dt[abs(ID - shift(ID, type="lag")) <= 1 | abs(shift(ID, type="lead") - ID) <= 1, # i
  InRun := TRUE # j
  , by=Char] # by

DT[i,j,by]所述的步骤是:使用过滤器i,然后用组by,然后计算j您不能以i此处尝试的方式进行按组计算

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Repast Simphony产生意外结果

使用 "%" 操作会产生意外结果

Perl按位运算会产生意外结果

使用goroutine进行迭代会产生意外结果

asfreq使用Period dtype产生意外结果

MySQL-使用LEFT JOIN会产生意外结果

Z3使用PDR引擎产生意外结果

尝试在别名中使用`pwd`会产生意外结果

使用ProcessPoolExcecutor进行多处理会产生意外结果

Bash脚本和大文件(错误):使用重定向内置的读取内容输入会产生意外结果

按组在data.table中使用:=分配多列

使用Data.Table包按组拟合模型

使用data.table按组抽样而不重复

按日期对数组进行排序会产生意外结果

使用np.savez存储字典会产生意外结果吗?

使用TimePeriod.NET的CalendarPeriodCollector计算“工作时间”会产生意外结果

在WHERE子句中混合使用AND和OR会产生意外结果

R,使用dplyr :: mutate和ifelse包含grepl()会产生意外结果

使用char **指针的字符串操作代码会产生意外结果

R计算股票的beta(使用PerformanceAnalytics CAPM.beta()函数或lm()函数产生意外结果)

为什么在std :: string上使用Sizeof运算符会产生意外结果?

Swift FlatMap与可选数组一起使用时会产生意外结果

使用std :: set的.begin()和.end()函数会产生意外的结果

使用python进行二进制读取会产生意外结果

如何使用data.table按日期(月,年,日)和子组汇总结果

在data.table中按组缩放

在data.table中按组绘制

按组条件过滤data.table

Python 3.6正则表达式产生意外结果(尽管使用字符串文字)

TOP 榜单

热门标签

归档