Мы можем использовать tidyverse
для создания 'index_event' после группировки по 'id_question'. Если количество строк больше 1 (n() >1
), тогда получите последовательность строк (row_number()
), а параметр по умолчанию в case_when
равен NA
library(dplyr)
df1 %>%
group_by(id_question) %>%
mutate(index_event = case_when(n() >1 ~ row_number()))
# A tibble: 10 x 4
# Groups: id_question [6]
# id_question id_event num_events index_event
# <int> <int> <int> <int>
# 1 2015012713 49508 1 NA
# 2 2015012711 49708 1 NA
# 3 2015011523 41808 3 1
# 4 2015011523 44008 3 2
# 5 2015011523 44108 3 3
# 6 2015011522 41508 3 1
# 7 2015011522 43608 3 2
# 8 2015011522 43708 3 3
# 9 2015011521 39708 1 NA
#10 2015011519 44208 1 NA
Или с data.table
, мы используем rowid
в 'id_question' и меняем элементы, которые равны 1 в 'num_events', на NA
с NA^
(используя NA^0
, NA^1
)
library(data.table)
setDT(df1)[, index_event := rowid(id_question) * NA^(num_events == 1)]
Или используя base R
, другой вариант с частотой sequence
от 'id_question' и измените элементы на NA, как в предыдущем случае
df1$index_event <- with(df1, sequence(table(id_question)) * NA^(num_events == 1))
df1$index_event
#[1] NA NA 1 2 3 1 2 3 NA NA
data
df1 <- structure(list(id_question = c(2015012713L, 2015012711L, 2015011523L,
2015011523L, 2015011523L, 2015011522L, 2015011522L, 2015011522L,
2015011521L, 2015011519L), id_event = c(49508L, 49708L, 41808L,
44008L, 44108L, 41508L, 43608L, 43708L, 39708L, 44208L), num_events = c(1L,
1L, 3L, 3L, 3L, 3L, 3L, 3L, 1L, 1L)), class = "data.frame", row.names = c(NA,
-10L))