如何根据价值变化的边界对数据框进行子集化?

时间:2018-01-27 17:07:26

标签: r

我有一个10个不同块的数据框,我想只占用每个块的前1500行。块由下面的ID列标识。这是一个浓缩版本来说明。

> mdf[1:15,1:4]
     x.1      x.2       x.3          ID
 1: 0.025061 0.0010093 0.0087476      1
 2: 0.025044 0.0010191 0.0087674      1
 3: 0.025023 0.0010280 0.0087716      2
 4: 0.025000 0.0010360 0.0087602      2
 5: 0.024974 0.0010433 0.0087334      2
 6: 0.024944 0.0010497 0.0086911      2
 7: 0.024912 0.0010553 0.0086335      2
 8: 0.024877 0.0010602 0.0085607      3
 9: 0.024839 0.0010643 0.0084728      3
 10: 0.024798 0.0010677 0.0083699      3
 11: 0.024753 0.0010703 0.0082521      3
 12: 0.024706 0.0010723 0.0081197      3
 13: 0.024656 0.0010735 0.0079726      4
 14: 0.024603 0.0010740 0.0078112      4
 15: 0.024546 0.0010739 0.0076356      4

我想要的是能够识别ID更改的行,然后保留接下来的1500行,在下一次ID更改之后丢弃所有内容。

我已尝试使用索引和for循环手动进行子集化,以找到值发生变化的地方,但我没有任何运气。这里的任何帮助都将非常感谢!!

1 个答案:

答案 0 :(得分:1)

请找到两种解决方案,以获得所需的输出。

setDT(df)[, head(.SD, 2), by = ID]

OR

通过避免每个组的.SD,大数据集的有效方式。

setDT(df)[, indx := seq_len(.N), by = ID][indx <= 2][,!("indx"),with=F]