根据条件添加一列;保留值,每次满足条件就增加

时间:2019-11-22 20:18:07

标签: r dataframe for-loop

我有一个“时间”列,并想根据“时间”的值生成一个列“ ID”。在首次出现时间= 0时,ID应该= 1。然后,ID应该保持= 1,直到遇到下一个时间= 0为止;那么ID将增加1。

新的数据集如下所示:

时间ID

0 1

1 1

2 1

0 2

1 2

这是示例数据帧。我有时间列,需要一个新的ID列。

structure(list(row = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 
29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 
45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 
61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 
77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 
93, 94, 95, 96, 97, 98, 99, 100), time = c(0, 1, 2, 3, 4, 0, 
1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 
2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 
1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 
2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 
3, 4, 0, 1, 2, 3, 0, 1, 2, 3)), class = "data.frame", row.names = c(NA, 
-100L))

谢谢。

1 个答案:

答案 0 :(得分:0)

最简单的解决方案是使用cumsum计算出现在时间列中的0,然后将其放入ID列:

data$id<-cumsum(data$time==0)

    row time id
1     1    0  1
2     2    1  1
3     3    2  1
4     4    3  1
5     5    4  1
6     6    0  2
7     7    1  2
8     8    2  2
9     9    3  2
10   10    4  2
11   11    0  3
12   12    1  3
13   13    2  3
14   14    3  3
15   15    4  3
16   16    0  4
17   17    1  4
18   18    2  4
19   19    3  4
20   20    4  4
21   21    0  5
22   22    1  5
23   23    2  5
24   24    3  5
25   25    4  5
26   26    0  6
27   27    1  6
28   28    2  6
29   29    3  6
30   30    4  6
31   31    0  7
32   32    1  7
33   33    2  7
34   34    3  7
35   35    4  7
36   36    0  8
37   37    1  8
38   38    0  9
39   39    1  9
40   40    2  9
41   41    3  9
42   42    4  9
43   43    0 10
44   44    1 10
45   45    2 10
46   46    3 10
47   47    4 10
48   48    0 11
49   49    1 11
50   50    2 11
51   51    3 11
52   52    4 11
53   53    0 12
54   54    1 12
55   55    2 12
56   56    3 12
57   57    4 12
58   58    0 13
59   59    1 13
60   60    2 13
61   61    3 13
62   62    4 13
63   63    0 14
64   64    1 14
65   65    2 14
66   66    3 14
67   67    4 14
68   68    0 15
69   69    1 15
70   70    2 15
71   71    3 15
72   72    4 15
73   73    0 16
74   74    1 16
75   75    2 16
76   76    3 16
77   77    4 16
78   78    0 17
79   79    1 17
80   80    2 17
81   81    3 17
82   82    4 17
83   83    0 18
84   84    1 18
85   85    2 18
86   86    3 18
87   87    4 18
88   88    0 19
89   89    1 19
90   90    2 19
91   91    3 19
92   92    4 19
93   93    0 20
94   94    1 20
95   95    2 20
96   96    3 20
97   97    0 21
98   98    1 21
99   99    2 21
100 100    3 21
相关问题