#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. Верно, извините, я неправильно понял, где находится закрывающая скобка. Я поместил ее не на то место в самом конце.