我有一个大型数据集,其中一列包含许多不同长度的连续运行(例如1,2,1,2,3,1,2,1,2,3,4,5)。 很多这些运行只有1,2 - 然后再从1开始。
我想以某种方式将我的数据分组/拆分为其中一个运行中包含的所有行。 让我们说为了简单起见,我的数据看起来像这样(我已经更新了列a以包含我实际数据中的前15个值来说明问题):
df <- data.frame(a = c(1:2, 1:5, 1:2, 1:4, 1:2), b = c(LETTERS[1:15]), c = c(1:15))
a b c
1 1 A 1
2 2 B 2
3 1 C 3
4 2 D 4
5 3 E 5
6 4 F 6
7 5 G 7
8 1 H 8
9 2 I 9
10 1 J 10
11 2 K 11
12 3 L 12
13 4 M 13
14 1 N 14
15 2 O 15
我希望获得一个组(或具有条件赋值的新列,我可以用来分组/拆分),其中包含df [,1]中的第一个运行(由行1,2和3组成),一个包含第二次运行(第4,5,6行),依此类推。
我试图在回答这个问题的未经编辑的版本时做出建议 test&lt; - group_by(df,a)%&gt;%mutate(run = seq(length(a)))
但是结果有些乱码,我怀疑这很大程度上是因为很多运行都达到了2。
Source: local data frame [15 x 4]
Groups: a [5]
a b c run
<int> <fctr> <int> <int>
1 1 A 1 1
2 2 B 2 1
3 1 C 3 2
4 2 D 4 2
5 3 E 5 1
6 4 F 6 1
7 5 G 7 1
8 1 H 8 3
9 2 I 9 3
10 1 J 10 4
11 2 K 11 4
12 3 L 12 2
13 4 M 13 2
14 1 N 14 5
15 2 O 15 5
编辑:解决方案
split(df, cumsum(c(TRUE, diff(df$a)!=1)))
效果很好。
答案 0 :(得分:0)
以下代码按您的意图创建一个运行变量。
df <- data.frame(a = c(1,2,3), b = c(LETTERS[1:9]), c = c(1:9))
library(dplyr)
df <- group_by(df, a) %>% mutate(run = seq(length(a)))