将新列追加到可以分组的数据

时间:2018-11-28 22:54:42

标签: r

我有以下示例数据。最后一列是前三列的组合,以“-”分隔。对于最后一列中定义的每个唯一“组”,“时间”列将始终按升序排列。数据按“行”,“大块”,“时间”排序。

我正在尝试将两列附加到此数据集。

   Line    Blk  Trp    Time       Group
1     1   1494  826   32280  1-1494-826
2     1   1494  865   32340  1-1494-865
3     1   1494  865   32640  1-1494-865
4     1   1494  865   32940  1-1494-865
5     1   1494  865   33180  1-1494-865
6     1   1494  865   33780  1-1494-865
7     1   1494  829   34080  1-1494-829
8     1   1494  829   34800  1-1494-829
9     1   1494  829   35280  1-1494-829
10    1   1494  829   35580  1-1494-829
11    1   1494  829   35880  1-1494-829
12    2   1495  926   32280  2-1495-926
13    2   1495  965   32340  2-1495-965
14    2   1495  965   32640  2-1495-965
15    2   1495  965   32940  2-1495-965
16    2   1495  965   33180  2-1495-965
17    2   1495  965   33780  2-1495-965
18    2   1495  929   34080  2-1495-929
19    2   1495  929   34800  2-1495-929
20    2   1495  929   35280  2-1495-929
21    2   1495  929   35580  2-1495-929

将两列附加后的输出如下所示。

每个唯一的“组”的“ Sqn”列始终从1开始,而当该“组”中的“时间”增加时,该列将增加1。

“ Rtn”列将只有两个值(D1,D2)。第一次遇到新的“行”号时,第一个唯一的“组”的值是D1。现在,在该特定“行”中,此值将交替显示D2,然后返回D1,以此类推。

   Line    Blk  Trp    Time       Group  Sqn  Rtn
1     1   1494  826   32280  1-1494-826    1   D1
2     1   1494  865   32340  1-1494-865    1   D2
3     1   1494  865   32640  1-1494-865    2   D2
4     1   1494  865   32940  1-1494-865    3   D2
5     1   1494  865   33180  1-1494-865    4   D2
6     1   1494  865   33780  1-1494-865    5   D2
7     1   1494  829   34080  1-1494-829    1   D1
8     1   1494  829   34800  1-1494-829    2   D1
9     1   1494  829   35280  1-1494-829    3   D1
10    1   1494  829   35580  1-1494-829    4   D1
11    1   1494  829   35880  1-1494-829    5   D1
12    2   1495  926   32280  2-1495-926    1   D1
13    2   1495  965   32340  2-1495-965    1   D2
14    2   1495  965   32640  2-1495-965    2   D2
15    2   1495  965   32940  2-1495-965    3   D2
16    2   1495  965   33180  2-1495-965    4   D2
17    2   1495  965   33780  2-1495-965    5   D2
18    2   1495  929   34080  2-1495-929    1   D1
19    2   1495  929   34800  2-1495-929    2   D1
20    2   1495  929   35280  2-1495-929    3   D1
21    2   1495  929   35580  2-1495-929    4   D1

我使用for循环进行了“ Sqn”列,并很快意识到它的效率很低。我试图查看是否可以使用diff,但是因为“组”列不是整数而卡住了。

任何将两列相加的有效解决方案将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可以为此使用dplyr

要添加Sqngroup_by组并添加row_number()

要添加Rtn:每当Sqn的值等于1时,我都会对其求和,然后测试结果是否为偶数。可能有一种更聪明的方法。

假设数据帧为df1

library(dplyr)
df1 %>% 
  group_by(Group) %>% 
  mutate(Sqn = row_number()) %>% 
  ungroup() %>% 
  mutate(Rtn = cumsum(Sqn == 1), 
         Rtn = ifelse(Rtn %% 2 == 0, "D2", "D1"))

结果:

# A tibble: 21 x 7
    Line   Blk   Trp  Time Group        Sqn Rtn  
   <int> <int> <int> <int> <chr>      <int> <chr>
 1     1  1494   826 32280 1-1494-826     1 D1   
 2     1  1494   865 32340 1-1494-865     1 D2   
 3     1  1494   865 32640 1-1494-865     2 D2   
 4     1  1494   865 32940 1-1494-865     3 D2   
 5     1  1494   865 33180 1-1494-865     4 D2   
 6     1  1494   865 33780 1-1494-865     5 D2   
 7     1  1494   829 34080 1-1494-829     1 D1   
 8     1  1494   829 34800 1-1494-829     2 D1   
 9     1  1494   829 35280 1-1494-829     3 D1   
10     1  1494   829 35580 1-1494-829     4 D1   
# ... with 11 more rows