我有以下示例数据。最后一列是前三列的组合,以“-”分隔。对于最后一列中定义的每个唯一“组”,“时间”列将始终按升序排列。数据按“行”,“大块”,“时间”排序。
我正在尝试将两列附加到此数据集。
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
,但是因为“组”列不是整数而卡住了。
任何将两列相加的有效解决方案将不胜感激。
答案 0 :(得分:1)
您可以为此使用dplyr
。
要添加Sqn
,group_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