【发布时间】:2017-10-21 00:39:03
【问题描述】:
我有一个数据表 dt,包含三列 nm、seqn 和 obj
> nm <- letters[1:22]
> seqn <- c(32,36, 86,45 , 47, 48, 49,
+ 52, 54, 59,
+ 66, 9, 69, 74, 81, 88, 90, 91, 93, 94, 95, 97)
> obj <- rep(c('c1', 'c2', 'c3'), c(7, 3, 12))
> dt <- data.table(nm, seqn, obj)
> dt
nm seqn obj
1: a 32 c1
2: b 36 c1
3: c 86 c1
4: d 45 c1
5: e 47 c1
6: f 48 c1
7: g 49 c1
8: h 52 c2
9: i 54 c2
10: j 59 c2
11: k 66 c3
12: l 9 c3
13: m 69 c3
14: n 74 c3
15: o 81 c3
16: p 88 c3
17: q 90 c3
18: r 91 c3
19: s 93 c3
20: t 94 c3
21: u 95 c3
22: v 97 c3
我想为每个“obj”组获得一个单调的“seqn”序列。我想在 obj "c1" 的情况下删除像 86(record 3) 这样的序列号(* 这里 86 是一个大数字,而通常是一系列小的单调 seqn 数字),在 obj "c3" 的情况下,我想要删除 seqn 9。(记录 12)(* 这里 9 是大数字单调 seqn 中的一个小数)。
如何使用 data.table/dataframe 做到这一点。
【问题讨论】:
-
我的逻辑是在较大的数字前后删除较小的数字,并在较大的数字前后删除较小的数字。那怎么办?
-
另外两个问题看起来几乎相同(数据除外):stackoverflow.com/questions/44030594/… 和 stackoverflow.com/questions/44027088/…
-
@Uwe:我是这么想的,但他们实际上有一个“最大重启”,这使它更容易且不可转移。 @Ravi:你可以这样做:
dt[!((seqn < shift(seqn, fill=0, type = "lag") | seqn > shift(seqn, fill=999, type = "lead")) & shift(seqn, fill=999, type = "lead") > shift(seqn, fill=999, type = "lag")), .SD, by = obj][] -
好像你不使用数据表。确保清除您的环境,在发布数据时重新加载数据,检查它是否属于数据表类型,然后在我的评论中运行代码,...对我来说可行。
-
@BigDataScientist OP 刚刚在this comment 中披露了 2 个附加要求,包括在达到最大值后重新启动和消除最多三个连续的失序值。这使得他的问题完全重复了另外两个链接的 Q,IMO。
标签: r dataframe data.table