#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