Добавьте строку в начало каждой группы во фрейме данных, используя dplyr - PullRequest
1 голос
/ 30 марта 2020

Надеюсь, у меня быстрый вопрос, но мне было трудно понять, что я хотел бы сделать. Я хотел бы:

  1. Сохранить группировку, которая существует в данных
  2. Добавить строку к каждой группе, которая имеет ноль в качестве значения для «значения» и для «месяцев в периоде» "как первая строка этой группы

Таким образом, первая строка нового фрейма данных будет 1, 0, 0 для my_group, value, months_in_period. Когда мы нажимаем my_group = 3, первая строка будет 3, 0, 0 для my_group, value, months_in_period

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

Пример данных

df_example <- 
structure(list(my_group = c(1L, 1L, 1L, 1L, 3L, 3L, 3L, 5L, 5L, 
5L, 7L, 7L, 7L), value = c(0.11, -1.27, -1.61, -0.59, -0.56, 
-2.06, -2.53, 0.98, -0.06, -2.65, -0.54, -0.05, -1.33), months_in_period = c(1L, 
2L, 3L, 4L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -13L))

# A tibble: 13 x 3
   my_group value months_in_period
      <int> <dbl>            <int>
 1        1  0.11                1
 2        1 -1.27                2
 3        1 -1.61                3
 4        1 -0.59                4
 5        3 -0.56                1
 6        3 -2.06                2
 7        3 -2.53                3
 8        5  0.98                1
 9        5 -0.06                2
10        5 -2.65                3
11        7 -0.54                1
12        7 -0.05                2
13        7 -1.33                3

Я пробовал это, но это явно не работает:

df_example %>% 
  group_by(my_group) %>%
  rbind(data.frame(my_group = .$my_group, value = 0, months_in_period = 0), .)

Любая помощь приветствуется!

1 Ответ

0 голосов
/ 30 марта 2020

Возможно, это не лучший способ сделать это, но вы можете преобразовать данные в широкоформатный формат, добавить дополнительную строку, а затем снова преобразовать в длинный формат

library(tidyverse)

# add one extra row to the 1st row
df1 <- df_example %>% 
  pivot_wider(names_from = my_group,
              values_from = value) %>% 
  add_row(.before = 0) 
df1
#> # A tibble: 5 x 5
#>   months_in_period   `1`   `3`   `5`   `7`
#>              <int> <dbl> <dbl> <dbl> <dbl>
#> 1               NA NA    NA    NA    NA   
#> 2                1  0.11 -0.56  0.98 -0.54
#> 3                2 -1.27 -2.06 -0.06 -0.05
#> 4                3 -1.61 -2.53 -2.65 -1.33
#> 5                4 -0.59 NA    NA    NA

# assign 0 to the 1st row
df1[1, ] <- 0
# convert to long format
df1 %>% 
  pivot_longer(-months_in_period, 
               names_to = 'my_group',
               values_to = "value") %>% 
  select(my_group, value, months_in_period) %>% 
  arrange(my_group, months_in_period) %>% 
  filter(!is.na(value))
#> # A tibble: 17 x 3
#>    my_group value months_in_period
#>    <chr>    <dbl>            <dbl>
#>  1 1         0                   0
#>  2 1         0.11                1
#>  3 1        -1.27                2
#>  4 1        -1.61                3
#>  5 1        -0.59                4
#>  6 3         0                   0
#>  7 3        -0.56                1
#>  8 3        -2.06                2
#>  9 3        -2.53                3
#> 10 5         0                   0
#> 11 5         0.98                1
#> 12 5        -0.06                2
#> 13 5        -2.65                3
#> 14 7         0                   0
#> 15 7        -0.54                1
#> 16 7        -0.05                2
#> 17 7        -1.33                3

Создано в 2020-03- 29 * представьте пакет (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...