R добавление указанного количества новых строк, условно основанных на другом столбце

#r #dataframe #data.table

Вопрос:

У меня есть набор данных, который выглядит примерно так, как показано ниже, за исключением тысяч строк для нескольких возрастных групп, периодов времени и состояний:

 state  time_period             gender   agegroup  cases
AL     1/1/2020-1/15/2020      F        10-19     2
AL     1/16/2020-1/30/2020     F        10-19     4
AL     1/31/2020-2/14/2020     F        10-19     5
AL     1/1/2020-1/15/2020      M        10-19     4
AL     1/16/2020-1/30/2020     M        10-19     17
AL     1/31/2020-2/14/2020     M        10-19     29
AK     1/1/2020-1/15/2020      M        20-29     50
AK     1/16/2020-1/30/2020     M        20-29     11
AK     1/31/2020-2/14/2020     M        20-29     29
AK     1/1/2020-1/15/2020      F        20-29     50
AK     1/16/2020-1/30/2020     F        20-29     11
AK     1/31/2020-2/14/2020     F        20-29     29
 

Я хочу условно добавлять новые строки на основе числа в столбце «Случаи», а затем полностью избавиться от столбца «случаи». Поэтому, если столбец «Случаи» = = 2, то я хочу, чтобы состояние, период времени, пол и возрастная группа повторялись два раза.

Поэтому, используя три верхние строки в качестве примера, я хочу, чтобы новый фрейм данных выглядел следующим образом:

 state  time_period             gender   agegroup 
AL     1/1/2020-1/15/2020      F        10-19     
AL     1/1/2020-1/15/2020      F        10-19     
AL     1/16/2020-1/30/2020     F        10-19     
AL     1/16/2020-1/30/2020     F        10-19     
AL     1/16/2020-1/30/2020     F        10-19     
AL     1/16/2020-1/30/2020     F        10-19     
AL     1/31/2020-2/14/2020     F        10-19     
AL     1/31/2020-2/14/2020     F        10-19     
AL     1/31/2020-2/14/2020     F        10-19     
AL     1/31/2020-2/14/2020     F        10-19     
AL     1/31/2020-2/14/2020     F        10-19  
 

Как бы я этого добился?

Ответ №1:

 out <- dat[rep(seq_along(dat$cases), dat$cases),-5]
head(out,20)
#     state         time_period gender agegroup
# 1      AL  1/1/2020-1/15/2020      F    10-19
# 1.1    AL  1/1/2020-1/15/2020      F    10-19
# 2      AL 1/16/2020-1/30/2020      F    10-19
# 2.1    AL 1/16/2020-1/30/2020      F    10-19
# 2.2    AL 1/16/2020-1/30/2020      F    10-19
# 2.3    AL 1/16/2020-1/30/2020      F    10-19
# 3      AL 1/31/2020-2/14/2020      F    10-19
# 3.1    AL 1/31/2020-2/14/2020      F    10-19
# 3.2    AL 1/31/2020-2/14/2020      F    10-19
# 3.3    AL 1/31/2020-2/14/2020      F    10-19
# 3.4    AL 1/31/2020-2/14/2020      F    10-19
# 4      AL  1/1/2020-1/15/2020      M    10-19
# 4.1    AL  1/1/2020-1/15/2020      M    10-19
# 4.2    AL  1/1/2020-1/15/2020      M    10-19
# 4.3    AL  1/1/2020-1/15/2020      M    10-19
# 5      AL 1/16/2020-1/30/2020      M    10-19
# 5.1    AL 1/16/2020-1/30/2020      M    10-19
# 5.2    AL 1/16/2020-1/30/2020      M    10-19
# 5.3    AL 1/16/2020-1/30/2020      M    10-19
# 5.4    AL 1/16/2020-1/30/2020      M    10-19
 

Имена строк безвредны (и могут быть сброшены до простых чисел), но они указывают (в дополнение к фактическим данным), что первые две строки взяты из строки 1, следующие четыре строки взяты из строки 2 и т. Д. (Я бы не стал полагаться на это, я просто выделяю артефакт, который подкрепляет утверждение.

Итоговое количество строк соответствует ожиданиям:

 sum(dat$cases)
# [1] 241
nrow(out)
# [1] 241