Как сохранить последовательность чисел до достижения определенного номера строки - PullRequest
0 голосов
/ 29 апреля 2018

Я пытался присвоить номера с последовательностью. Я хотел бы добавить еще раз, чтобы повторить последовательность, пока не достигли определенные номера строк. Например, повторите последовательность для каждой 44-й строки.

Вот что я имею в виду

test_table <- data.frame(col=rep(0:10,each=11),  row=c(rev(0:10)))

и присвоение кумулятивных чисел этим способом

> library(dplyr)
 test_table%>%
 mutate(No=(row_number() - 1) %/% 11)

test_table  
        col row No
    1     0  10  0
    2     0   9  0
    3     0   8  0
    4     0   7  0
    5     0   6  0
    6     0   5  0
    7     0   4  0
    8     0   3  0
    9     0   2  0
    10    0   1  0
    11    0   0  0
    12    1  10  1
    13    1   9  1
    14    1   8  1
    15    1   7  1
    16    1   6  1
    17    1   5  1
    18    1   4  1
    19    1   3  1
    20    1   2  1
    21    1   1  1
    22    1   0  1
    23    2  10  2
    24    2   9  2
    25    2   8  2
    26    2   7  2
    27    2   6  2
    28    2   5  2
    29    2   4  2
    30    2   3  2
    31    2   2  2
    32    2   1  2
    33    2   0  2
    34    3  10  3
    35    3   9  3
    36    3   8  3
    37    3   7  3
    38    3   6  3
    39    3   5  3
    40    3   4  3
    41    3   3  3
    42    3   2  3
    43    3   1  3
    44    3   0  3
    45    4  10  4
    46    4   9  4
    47    4   8  4
    48    4   7  4
    49    4   6  4
    50    4   5  4
    51    4   4  4
    52    4   3  4
    53    4   2  4
    54    4   1  4
    55    4   0  4
    56    5  10  5
    57    5   9  5
    58    5   8  5
    59    5   7  5
    60    5   6  5
    61    5   5  5
    62    5   4  5
    63    5   3  5
    64    5   2  5
    65    5   1  5
    66    5   0  5
    67    6  10  6
    68    6   9  6
    69    6   8  6
    70    6   7  6
    71    6   6  6
    72    6   5  6
    73    6   4  6
    74    6   3  6
    75    6   2  6
    76    6   1  6
    77    6   0  6
    78    7  10  7
    79    7   9  7
    80    7   8  7
    81    7   7  7
    82    7   6  7
    83    7   5  7
    84    7   4  7
    85    7   3  7
    86    7   2  7
    87    7   1  7
    88    7   0  7
    89    8  10  8
    90    8   9  8
    91    8   8  8
    92    8   7  8
    93    8   6  8
    94    8   5  8
    95    8   4  8
    96    8   3  8
    97    8   2  8
    98    8   1  8
    99    8   0  8
    100   9  10  9
    101   9   9  9
    102   9   8  9
    103   9   7  9
    104   9   6  9
    105   9   5  9
    106   9   4  9
    107   9   3  9
    108   9   2  9
    109   9   1  9
    110   9   0  9
    111  10  10 10
    112  10   9 10
    113  10   8 10
    114  10   7 10
    115  10   6 10
    116  10   5 10
    117  10   4 10
    118  10   3 10
    119  10   2 10
    120  10   1 10
    121  10   0 10

Хорошо. Хорошо! Но я хотел бы сохранить последовательность, например 0 and 1, до достижения 44-го ряда. После этого начните с новой последовательности с 2 и перейдите на 88-ю строку следующим образом.

Таким образом, ожидаемый результат будет

test_table  
      col row No
    1     0  10  0
    2     0   9  0
    3     0   8  0
    4     0   7  0
    5     0   6  0
    6     0   5  0
    7     0   4  0
    8     0   3  0
    9     0   2  0
    10    0   1  0
    11    0   0  0
    12    1  10  1
    13    1   9  1
    14    1   8  1
    15    1   7  1
    16    1   6  1
    17    1   5  1
    18    1   4  1
    19    1   3  1
    20    1   2  1
    21    1   1  1
    22    1   0  1
    23    2  10  0
    24    2   9  0
    25    2   8  0
    26    2   7  0
    27    2   6  0
    28    2   5  0
    29    2   4  0
    30    2   3  0
    31    2   2  0
    32    2   1  0
    33    2   0  0
    34    3  10  1
    35    3   9  1
    36    3   8  1
    37    3   7  1
    38    3   6  1
    39    3   5  1
    40    3   4  1
    41    3   3  1
    42    3   2  1
    43    3   1  1
    44    3   0  1
    45    4  10  2
    46    4   9  2
    47    4   8  2
    48    4   7  2
    49    4   6  2
    50    4   5  2
    51    4   4  2
    52    4   3  2
    53    4   2  2
    54    4   1  2
    55    4   0  2
    56    5  10  3
    57    5   9  3
    58    5   8  3
    59    5   7  3
    60    5   6  3
    61    5   5  3
    62    5   4  3
    63    5   3  3
    64    5   2  3
    65    5   1  3
    66    5   0  3
    67    6  10  2
    68    6   9  2
    69    6   8  2
    70    6   7  2
    71    6   6  2
    72    6   5  2
    73    6   4  2
    74    6   3  2
    75    6   2  2
    76    6   1  2
    77    6   0  2
    78    7  10  3
    79    7   9  3
    80    7   8  3
    81    7   7  3
    82    7   6  3
    83    7   5  3
    84    7   4  3
    85    7   3  3
    86    7   2  3
    87    7   1  3
    88    7   0  3
    89    8  10  4
    90    8   9  4
    91    8   8  4
    92    8   7  4
    93    8   6  4
    94    8   5  4
    95    8   4  4
    96    8   3  4
    97    8   2  4
    98    8   1  4
    99    8   0  4
    100   9  10  5
    101   9   9  5
    102   9   8  5
    103   9   7  5
    104   9   6  5
    105   9   5  5
    106   9   4  5
    107   9   3  5
    108   9   2  5
    109   9   1  5
    110   9   0  5
    111  10  10  4
    112  10   9  4
    113  10   8  4
    114  10   7  4
    115  10   6  4
    116  10   5  4
    117  10   4  4
    118  10   3  4
    119  10   2  4
    120  10   1  4
    121  10   0  4

Как мы можем это сделать? Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 29 апреля 2018

Это сделало бы это более общим способом

num.seq = 11L            # total number of sequences in the first column
num.rows = N * num.seq   # total number of rows
seq.length.3 = 44        # length of the pattern in the 3rd column

# number of paterns in the 3rd column
num.seq.3 = ( num.rows - 1 )  %/% seq.length.3 +1   

# starting number in the sequence of the 3rd column
nseq=0

# vector for the 3rd column (could be done right in data frame def.)             
No = (rep(rep( nseq:(nseq+1), each = N, times= 2), times=num.seq.3) + 
      rep(0:(num.seq.3 -1)*2, each= seq.length.3)) [1:num.rows]

test_table <- data.frame(col=rep(0:10,each=11),  
                         row=c(rev(0:10)),
                         No=No)

Альтернативный способ:

library(dplyr)
dt2 <- test_table%>%
  mutate(No = (row_number() - 1) %/% 11) 
dt2$No <- dt2$No %% 2 + (rep(0:num.seq.3, each =44, times=num.seq.3 )*2) 
          [1:num.rows]
0 голосов
/ 29 апреля 2018

Арифметика, которая полностью зависит от номеров строк, кажется правильной.

test_table%>%
  mutate(No=((row_number() - 1) %/% 11) %% 2) %>% # alternating 11 rows of 0's and 1's 
  mutate(No = No + ((row_number() - 1) %/% 44) * 2) # add 2 every after 44 rows

Вот результат, как и предполагалось.

structure(list(col = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 8L, 8L, 
8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 
9L, 9L, 9L, 9L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 
10L, 10L), row = c(10L, 9L, 8L, 7L, 6L, 5L, 4L, 3L, 2L, 1L, 0L, 
10L, 9L, 8L, 7L, 6L, 5L, 4L, 3L, 2L, 1L, 0L, 10L, 9L, 8L, 7L, 
6L, 5L, 4L, 3L, 2L, 1L, 0L, 10L, 9L, 8L, 7L, 6L, 5L, 4L, 3L, 
2L, 1L, 0L, 10L, 9L, 8L, 7L, 6L, 5L, 4L, 3L, 2L, 1L, 0L, 10L, 
9L, 8L, 7L, 6L, 5L, 4L, 3L, 2L, 1L, 0L, 10L, 9L, 8L, 7L, 6L, 
5L, 4L, 3L, 2L, 1L, 0L, 10L, 9L, 8L, 7L, 6L, 5L, 4L, 3L, 2L, 
1L, 0L, 10L, 9L, 8L, 7L, 6L, 5L, 4L, 3L, 2L, 1L, 0L, 10L, 9L, 
8L, 7L, 6L, 5L, 4L, 3L, 2L, 1L, 0L, 10L, 9L, 8L, 7L, 6L, 5L, 
4L, 3L, 2L, 1L, 0L), No = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 
4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 
4, 4, 4, 4, 4)), class = "data.frame", .Names = c("col", "row", 
"No"), row.names = c(NA, -121L))
0 голосов
/ 29 апреля 2018

Это даст то, что, как я понимаю, будет запрошенным вектором (за исключением того, что, я думаю, ваша последовательность "пропустила удар"):

 c( rep( c(1,2,1,2), each=11) , rep(c(3,4,3,4), each=11), rep(c(5,6,5,6), each=11) )
  [1] 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 3 3 3
 [48] 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5
 [95] 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6

Более общий способ:

c( sapply( seq(1, 6, by=2), function(start) { 
                                    rep( rep(start:(start+1) , 2), each=11) }))

Внешний c () удалит символ матрицы, который по умолчанию имеет значение sapply.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...