Заполните и заполните серию, уменьшив значение в группе Tidyr - PullRequest
0 голосов
/ 14 ноября 2018

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

dat <- structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L
), id2 = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), id3 = c("ID_1", 
"ID_1", "ID_1", "ID_1", "ID_1", "ID_2", "ID_3", "ID_4", "ID_5", 
"ID_6", "ID_7", "ID_8", "ID_9", "ID_10", "ID_11", "ID_12", "ID_12", 
"ID_12", "ID_12", "ID_13", "ID_14", "ID_15", "ID_16", "ID_17", 
"ID_18", "ID_19"), n_clstr = c(5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 3L, 3L, 2L, 1L, 1L, 1L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 3L, 2L, 
1L, 1L), clstr_number = c(1L, 2L, 3L, 4L, 5L, NA, NA, NA, NA, 
NA, NA, NA, 1L, 1L, 1L, 1L, 2L, 3L, 4L, NA, NA, NA, NA, NA, 1L, 
1L), value = c(0.35, 0.43, 0.51, 0.57, 1, NA, NA, NA, NA, NA, 
NA, NA, 1, 1, 1, 0.2, 0.62, 0.79, 1, NA, NA, NA, NA, NA, 1, 1
)), row.names = c(NA, -26L), class = c("tbl_df", "tbl", "data.frame"
), spec = structure(list(cols = list(id = structure(list(), class = c("collector_integer", 
"collector")), id2 = structure(list(), class = c("collector_integer", 
"collector")), id3 = structure(list(), class = c("collector_character", 
"collector")), n_clstr = structure(list(), class = c("collector_integer", 
"collector")), clstr_number = structure(list(), class = c("collector_integer", 
"collector")), value = structure(list(), class = c("collector_double", 
"collector"))), default = structure(list(), class = c("collector_guess", 
"collector"))), class = "col_spec"))

Таким образом, вы можете видеть, что данные сгруппированы по вложенным идентификаторам. Для краткости я не предоставил дополнительно id, но их будет больше одного. Итак, шаги, которые я представляю себе:

  1. Группировка по `c (id, id2, id3)
  2. Заполнить номер clstr_n_cluster и назначить clstr_number = seq(max(n_clstr)-n_clstr, n_clstr,1)
  3. Заполните соответствующие значения сверху
  4. Когда n_cluster уменьшается, заполните value самыми высокими n значениями

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

dat_final <- structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L), id2 = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), 
  X3 = c("ID_1", "ID_1", "ID_1", "ID_1", "ID_1", "ID_2", "ID_2", 
  "ID_2", "ID_2", "ID_2", "ID_3", "ID_3", "ID_3", "ID_3", "ID_3", 
  "ID_4", "ID_4", "ID_4", "ID_4", "ID_4", "ID_5", "ID_5", "ID_5", 
  "ID_5", "ID_5", "ID_6", "ID_6", "ID_6", "ID_7", "ID_7", "ID_7", 
  "ID_8", "ID_8", "ID_9", "ID_10", "ID_11", "ID_12", "ID_12", 
  "ID_12", "ID_12", "ID_13", "ID_13", "ID_13", "ID_13", "ID_14", 
  "ID_14", "ID_14", "ID_14", "ID_15", "ID_15", "ID_15", "ID_15", 
  "ID_16", "ID_16", "ID_16", "ID_16", "ID_17", "ID_18", "ID_19"
  ), n_clstr = c(5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
  5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 3L, 
  3L, 3L, 3L, 3L, 3L, 2L, 2L, 1L, 1L, 1L, 4L, 4L, 4L, 4L, 4L, 
  4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 3L, 3L, 3L, 2L, 
  2L, 1L, 1L), clstr_number = c(1L, 2L, 3L, 4L, 5L, 1L, 2L, 
  3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 
  3L, 4L, 5L, 3L, 4L, 5L, 3L, 4L, 5L, 4L, 5L, 1L, 1L, 1L, 1L, 
  2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 
  2L, 3L, 4L, 3L, 4L, 1L, 1L), value = c(0.35, 0.43, 0.51, 
  0.57, 1, 0.35, 0.43, 0.51, 0.57, 1, 0.35, 0.43, 0.51, 0.57, 
  1, 0.35, 0.43, 0.51, 0.57, 1, 0.35, 0.43, 0.51, 0.57, 1, 
  0.51, 0.57, 1, 0.51, 0.57, 1, 0.57, 1, 1, 1, 1, 0.2, 0.62, 
  0.79, 1, 0.2, 0.62, 0.79, 1, 0.2, 0.62, 0.79, 1, 0.2, 0.62, 
  0.79, 1, 0.62, 0.79, 1, 0.79, 1, 1, 1)), row.names = c(NA, 
-59L), class = c("tbl_df", "tbl", "data.frame"), spec = structure(list(
  cols = list(id = structure(list(), class = c("collector_integer", 
  "collector")), id2 = structure(list(), class = c("collector_integer", 
  "collector")), X3 = structure(list(), class = c("collector_character", 
  "collector")), n_clstr = structure(list(), class = c("collector_integer", 
  "collector")), clstr_number = structure(list(), class = c("collector_integer", 
  "collector")), value = structure(list(), class = c("collector_double", 
  "collector"))), default = structure(list(), class = c("collector_guess", 
  "collector"))), class = "col_spec"))
...