Создание условной последовательности в фрейме данных в R

#r #matrix #seq

#r #матрица #продолжение

Вопрос:

Хотите заполнить матрицу условной последовательностью. В данных есть несколько разрывов, но эти разрывы / пробелы должны поддерживаться.

Вот пример матрицы для того, чего я пытаюсь достичь. Первый столбец — это исходные данные. Второй столбец — это то, что я пытаюсь создать.

 try <- matrix(c(rep(0,4),rep(1,3),rep(0,2),rep(1,2), rep(0,4), seq(1,3,1), rep(0,2), seq(4,5,1)),ncol=2)
  

Я пытался использовать seq_long, цикл while и т.д., Но, похоже, это не работает. Будем признательны за любую помощь / указатели.

Ответ №1:

Возможно, вам нужно решение из следующих двух шагов.

 try[, 2] <- ave(try[, 1], try[, 1], FUN = seq_along)
try[try[, 1] == 0, 2] <- 0

try[, 2]
#[1] 0 0 0 0 1 2 3 0 0 4 5
  

Однострочный — это

 ave(try[, 1], try[, 1], FUN = function(x) if(any(x == 0)) x else seq_along(x))
#[1] 0 0 0 0 1 2 3 0 0 4 5
  

Комментарии:

1. Я думаю, вы также могли бы сделать try[,2][try[,1] ==1] <- seq(sum(try[,1] == 1))

2. Работает идеально. Именно то, к чему я стремился. Я выбрал однострочный вариант. Работает очень быстро! Спасибо @Rui Barradas

Ответ №2:

Рассмотрим try , как ваши данные (1-й столбец) вы можете сделать:

 try$second_column <- cumsum(try[,1])*try[,1]
  

Комментарии:

1. Верно, извините, я неправильно понял, где находится закрывающая скобка. Я поместил ее не на то место в самом конце.