#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