Создание вектора, последовательные элементы которого повторяются столько раз, сколько соответствующие значения в соседних столбцах

#r #vectorization

#r #векторизация

Вопрос:

В приведенном ниже примере фрейма данных выходной вектор должен быть [1] 1,1,1,2,1,1,1,2,2,3,3,3,4,5,5,5,5,1,1,2,3,3,3

 P   N   N 1 N 2 N 3 N 4
2   3   1   1   2   1
5   3   2   3   1   4
3   2   1   3   4   5
 

Объяснение:

  • Значения в P определяют, как далеко вправо следует считывать значения фрейма данных. Затем значения в seq(P) должны повторяться столько раз.
  • Первое значение P равно 2, что означает, что в seq(2) (что равно 1,2) первый элемент должен повторяться 3 раза, а второй элемент должен повторяться 1 раз.
  • Это потому, что значение P (2) указывает на чтение первых двух элементов с правой стороны. Эти значения в правой части сами указывают, сколько раз должны повторяться последовательные элементы 2.

Ответ №1:

Вариантом здесь было бы перебирать строки apply MARGIN = 1 , а затем получать на seq основе первого элемента, т. Е. ‘P’, реплицировать seq влияние с соответствующими значениями ‘N’ столбцов, подмножеств этой последовательности

 unlist(apply(df1, 1, function(x)  {
        i1 <- seq(x[1])
        rep(i1, x[-1][i1])
       }))
 

-вывод

 #[1] 1 1 1 2 1 1 1 2 2 3 3 3 4 5 5 5 5 1 1 2 3 3 3
 

данные

 df1 <- structure(list(P = c(2L, 5L, 3L), N = c(3L, 3L, 2L), `N 1` = c(1L, 
2L, 1L), `N 2` = c(1L, 3L, 3L), `N 3` = c(2L, 1L, 4L), `N 4` = c(1L, 
4L, 5L)), class = "data.frame", row.names = c(NA, -3L))