別の値に基づいてシーケンスを繰り返す
Aug 18 2020
私は次のように設定されたデータ構造を扱っています:
データ
structure(list(ID = c(1147L, 1147L, 1147L, 1147L, 1147L, 1147L,
1147L, 1147L, 1147L, 1147L, 1147L, 1147L, 4085L, 4085L, 4085L,
4085L, 4085L, 4085L, 4085L), year = c(1L, 1L, 1L, 2L, 2L, 2L,
3L, 3L, 3L, 4L, 4L, 4L, 1L, 1L, 1L, 2L, 2L, 2L, 3L), term = c(1L,
3L, 5L, 1L, 3L, 5L, 1L, 3L, 5L, 1L, 3L, 5L, 1L, 3L, 5L, 1L, 3L,
5L, 1L), reportedFY = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA), minFY = c(2016L, 2016L,
2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L,
2016L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L)), class = "data.frame", row.names = c(NA,
-19L))
ID year term reportedFY minFY
1147 1 1 NA 2016
1147 1 3 NA 2016
1147 1 5 NA 2016
1147 2 1 NA 2016
1147 2 3 NA 2016
1147 2 5 NA 2016
1147 3 1 NA 2016
1147 3 3 NA 2016
1147 3 5 NA 2016
1147 4 1 NA 2016
1147 4 3 NA 2016
1147 4 5 NA 2016
4085 1 1 NA 2019
4085 1 3 NA 2019
4085 1 5 NA 2019
4085 2 1 NA 2019
4085 2 3 NA 2019
4085 2 5 NA 2019
4085 3 1 NA 2019
各ID(約9000あり、それぞれ12回繰り返し、毎年3回繰り返します。私がやろうとしているのは、minFYに基づいてIDごとにシーケンスを繰り返すことです。したがって、ID1147には次のシーケンスがあります。 2016,2017,2018,2019では、毎年3回繰り返されます。一方、4085には、それぞれ3回繰り返される2019,2020,2021,2022のシーケンスがあります。
私はこれに沿って何かを使おうとしてきましたが、明らかに機能していません。
prog_structure2$reportedFY <- rep(c(minFY, minFY+1, minFY+2, minFY+3), time=9306, each=3)
どんな助けでもいただければ幸いです!
回答
1 YuriySaraykin Aug 18 2020 at 22:37
ベースR
df$reportedFY <- ave(df$minFY, df$ID, FUN = function(x) rep(min(x) + 0:3, each = 3))
ID year term reportedFY minFY
1 1147 1 1 2016 2016
2 1147 1 3 2016 2016
3 1147 1 5 2016 2016
4 1147 2 1 2017 2016
5 1147 2 3 2017 2016
6 1147 2 5 2017 2016
7 1147 3 1 2018 2016
8 1147 3 3 2018 2016
9 1147 3 5 2018 2016
10 1147 4 1 2019 2016
11 1147 4 3 2019 2016
12 1147 4 5 2019 2016
13 4085 1 1 2019 2019
14 4085 1 3 2019 2019
15 4085 1 5 2019 2019
16 4085 2 1 2020 2019
17 4085 2 3 2020 2019
18 4085 2 5 2020 2019
19 4085 3 1 2021 2019
VPMancy Aug 18 2020 at 22:00
これはあなたのために働くはずです:
library(dplyr)
d <- data.frame('ID' = c(rep(1147, 12), rep(4085,12)),
'year' = rep(rep(1:4,each=3),2),
'term' = rep(c(1,3,5),8),
'reportedFY' = NA,
'minFY' = c(rep(2016, 12), rep(2019,12)))
d <- d %>% group_by(ID) %>% mutate(reportedFY = rep(seq(first(minFY),(first(minFY)+3)),each = 3))