Повторяющаяся последовательность, основанная на другом значении

#r #dplyr #sequence

#r #dplyr #последовательность

Вопрос:

Я имею дело со структурой данных, настроенной следующим образом:

Данные

 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

  

Каждый идентификатор (которых насчитывается около ~ 9000, повторяется по 12 раз каждый, причем каждый год повторяется 3 раза. Что я пытаюсь сделать, так это повторить последовательность для каждого идентификатора на основе minFY. Таким образом, идентификатор 1147 будет иметь последовательность 2016,2017,2018,2019, где каждый год повторяется 3 раза. Тогда как 4085 будет иметь последовательность 2019,2020,2021,2022, которая повторяется по 3 раза каждая.

Я пытался использовать что-то вроде этого, что, очевидно, не работает:

 prog_structure2$reportedFY <- rep(c(minFY, minFY 1, minFY 2, minFY 3), time=9306, each=3)

  

Любая помощь была бы оценена!

Комментарии:

1. Вы могли бы попробовать expand.grid(ID = c(1147, 4085), year = 1:3, term = c(1, 3, 5), reportedFY = NA, minFY = 0) (где вы заменяете ID на 9306 идентификаторов), затем установите reportedFY на year и добавьте соответствующее количество лет для каждого идентификатора.

2. Может быть, попробовать: with(prog_structure2, ave(minFY, ID, FUN=function(x) seq(x[1], length.out=4)))

3. или i <- seq(1, by=12, length.out=ceiling(nrow(prog_structure2)/12)); c(apply(sapply(prog_structure2$minFY[i], seq, length.out=4), 2, rep, 3))

Ответ №1:

база 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
  

Ответ №2:

Это должно сработать для вас :

 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))
  

Комментарии:

1. Я получаю аналогичную ошибку, как указано выше: Error in seq.default(first(minFY), (first(minFY) 3)) : 'from' must be of length 1

2. Можете ли вы показать, что именно вы вводите в R? вы не должны получать никаких ошибок. Это решение точно такое же, как указано выше за пару минут до этого. что вы получите, если введете seq.default(first(d$minFY), (first(d$minFY) 3))