R - Вставить пропущенные числа в последовательность по максимальному значению группы - PullRequest
0 голосов
/ 08 марта 2019

Я хотел бы вставить пропущенные числа в столбец индекса, выполнив следующие два условия:

  1. Разделен на несколько столбцов
  2. Минимальное значение всегда равно 1
  3. Максимальное значение всегда является максимальным для группы и типа

Текущие данные:

group   type    index   vol
A       1       1       200
A       1       2       244
A       1       5       33

A       2       2       66
A       2       3       2
A       2       4       199
A       2       10      319

B       1       4       290
B       1       5       188
B       1       6       573
B       1       9       122

Желаемые данные:

group   type    index   vol
A       1       1       200
A       1       2       244
A       1       3       0
A       1       4       0
A       1       5       33

A       2       1       0
A       2       2       66
A       2       3       2
A       2       4       199
A       2       5       0
A       2       6       0
A       2       7       0
A       2       8       0
A       2       9       0
A       2       10      319

B       1       1       0
B       1       2       0
B       1       3       0
B       1       4       290
B       1       5       188
B       1       6       573
B       1       7       0
B       1       8       0
B       1       9       122

Я только чтодля ясности добавлены пробелы между разделами.

Надеюсь, вы поможете!

Ответы [ 2 ]

2 голосов
/ 08 марта 2019

Вы можете сделать следующее

library(dplyr)
library(tidyr)

my_df %>% 
  group_by(group, type) %>% 
  complete(index = 1:max(index), fill = list(vol = 0))

#    group type index vol
# 1      A    1     1 200
# 2      A    1     2 244
# 3      A    1     3   0
# 4      A    1     4   0
# 5      A    1     5  33
# 6      A    2     1   0
# 7      A    2     2  66
# 8      A    2     3   2
# 9      A    2     4 199
# 10     A    2     5   0
# 11     A    2     6   0
# 12     A    2     7   0
# 13     A    2     8   0
# 14     A    2     9   0
# 15     A    2    10 319
# 16     B    1     1   0
# 17     B    1     2   0
# 18     B    1     3   0
# 19     B    1     4 290
# 20     B    1     5 188
# 21     B    1     6 573
# 22     B    1     7   0
# 23     B    1     8   0
# 24     B    1     9 122

С помощью group_by вы указываете группы, которые вы указали с пробелами.С помощью complete вы указываете, какие столбцы должны быть заполнены, а затем какие значения должны быть заполнены для оставшегося столбца (по умолчанию будет NA)

Данные

my_df <- 
  structure(list(group = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("A", "B"), class = "factor"), 
                 type = c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L), 
                 index = c(1L, 2L, 5L, 2L, 3L, 4L, 10L, 4L, 5L, 6L, 9L), 
                 vol = c(200L, 244L, 33L, 66L, 2L, 199L, 319L, 290L, 188L, 573L, 122L)), 
            class = "data.frame", row.names = c(NA, -11L))
1 голос
/ 08 марта 2019

Одна dplyr и tidyr возможность может быть:

df %>%
 group_by(group, type) %>%
 complete(index = full_seq(1:max(index), 1), fill = list(vol = 0))

   group  type index   vol
   <fct> <int> <dbl> <dbl>
 1 A         1     1   200
 2 A         1     2   244
 3 A         1     3     0
 4 A         1     4     0
 5 A         1     5    33
 6 A         2     1     0
 7 A         2     2    66
 8 A         2     3     2
 9 A         2     4   199
10 A         2     5     0
11 A         2     6     0
12 A         2     7     0
13 A         2     8     0
14 A         2     9     0
15 A         2    10   319
16 B         1     1     0
17 B         1     2     0
18 B         1     3     0
19 B         1     4   290
20 B         1     5   188
21 B         1     6   573
22 B         1     7     0
23 B         1     8     0
24 B         1     9   122
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...