Реплицируйте диапазон значений, если условие выполнено

#r #rep

Вопрос:

Я пытаюсь добавить столбец (транзакцию) в приведенный ниже образец фрейма данных, в котором логика заключается в том, что для каждого «Нового значения» в столбце индекса репликация значений начнется сначала. Значение в индексе будет помечено как «Новое» случайным образом среди всего фрейма данных (более 150 000 строк). Я хочу, чтобы первая строка начиналась с 1, и после каждой последовательности 1:3 последовательность будет начинаться с 1 после 3, если в столбце индекса нет «Нового», в котором последовательность автоматически начинается с 1. Я пытался использовать rep() и ifelse в различных комбинациях, но безуспешно. Кроме того, столбец Транзакции в настоящее время пуст без значений. Заранее благодарю вас!

Указатель Операция
1
2
3
1
2
3
Новое 1
2
Новое 1
2
3
1
Новое 1
2

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

1. Можете ли вы заполнить столбец индекса подробнее? Было бы неплохо посмотреть, что именно там находится.

2. Это точное описание столбца индекса. Цель столбца в этом случае-определить, когда атрибут изменяется от одного значения к другому. Например, первые 6 строк могут быть связаны со 101, но 7-я строка-102 и помечена как «Новая», или, скорее, нет других значений, кроме «Новой» или пустой.

3. смотрите мою попытку ниже.

4. Спасибо! Похоже, это работает в соответствии с просьбой. Мне нужно потратить некоторое время на то, чтобы точно понять, что происходит, особенно с cumsum. Я даже не рассматривал group_by, а затем разгруппироваться.

5. cumsum это создание индекса, который мы можем использовать для группировки. Сначала вы создаете двоичный вектор, а затем суммируете значения.

Ответ №1:

Вот первая попытка:

 library(tidyverse)

# Creating the data frame: 
df <- data.frame(index = rep("", 14))
df[c(7,9,13), 'index'] <- 'New'


# Defining a run index:
df$run <- cumsum(df$index == "New")


df %>% 
  group_by(run) %>% 
  mutate(Transaction = ifelse( (1:n())%%3==0, 3, 1:n()%%3  )) %>%
  ungroup() %>% select(-run)

  # A tibble: 14 x 2
   index Transaction
   <chr>       <dbl>
 1 ""              1
 2 ""              2
 3 ""              3
 4 ""              1
 5 ""              2
 6 ""              3
 7 "New"           1
 8 ""              2
 9 "New"           1
10 ""              2
11 ""              3
12 ""              1
13 "New"           1
14 ""              2