Как сложить все уникальные факторы в столбце на основе функции group_by в R и вывести в виде нового столбца? - PullRequest
2 голосов
/ 23 апреля 2020

У меня есть фрейм данных, который состоит из 4 столбцов, где год начинается с 2016-2018, а значения Lost_Reason имеют в общей сложности 15 уникальных «причин», которые подсчитываются каждый год:

Year1 LOST_REASON                   TotalLost
  <chr> <fct>                             <int>
1 2016  ""                                    0
2 2016  "Change in Business Strategy"        31
3 2016  "Data Issue"                         12
4 2016  "Lack of Adoption"                   21
5 2016  "Lack of Value"                      14
6 2016  "Lost to Competition"                20

Как я могу переформатируйте этот фрейм данных, который был сгенерирован этим простым кодом:

df_test1 <- complete_df %>%
  mutate(full_year = format(as.Date(CLOSEDATE, format = "%m/%d/%Y"), "%Y-%m-%d")) %>%
  group_by(Year1, LOST_REASON) %>%
  summarise(TotalWon = sum(STAGENAME == 'Closed Won'), TotalLost = sum(STAGENAME == 'CS: Non-Renewal'))

, чтобы сопоставить выходные данные, например, где коэффициенты "Lost_Reason" суммируются за год с генерируемым столбцом "total":

                       Reason 2016 2017 2018 Total
1 Change in Business Strategy   31   39   45   151
2                  Data Issue   12   20   11    51
3            Lack of Adoption   21   25   26    89
4               Lack of Value   14   23   20    90
5         Lost to Competition   20   13   13    66
6                   No Budget   14   27   41   103

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Рабочий процесс, который я бы использовал: group_by и summarize для создания столбца суммы, затем pivot_wider для разбивки по годам и, наконец, left_join для объединения двух.

Примечание. Я создаю суммы, пока данные все еще находятся в «аккуратном» формате. Вы можете суммировать по строкам после поворота данных, но это будет более сложно (для меня, во всяком случае).

library(dplyr)
library(tidyr)

df_1 <- tribble(
  ~Year1,~LOST_REASON,~TotalLost,
  2016,  ""                                    ,0,
  2016,  "Change in Business Strategy"        ,31,
  2016,  "Data Issue"                         ,12,
  2016,  "Lack of Adoption"                   ,21,
  2016,  "Lack of Value"                      ,14,
  2016,  "Lost to Competition"                ,20,
  2017,  ""                                    ,0,
  2017,  "Change in Business Strategy"        ,31,
  2018,  "Data Issue"                         ,12,
  2019,  "Lack of Adoption"                   ,21,
  2020,  "Lack of Value"                      ,14,
  2020,  "Lost to Competition"                ,20
)

Sums <- df_1 %>% group_by(LOST_REASON) %>% 
  summarise(Sum=sum(TotalLost,na.rm = TRUE))

Sums
#> # A tibble: 6 x 2
#>   LOST_REASON                     Sum
#>   <chr>                         <dbl>
#> 1 ""                                0
#> 2 "Change in Business Strategy"    62
#> 3 "Data Issue"                     24
#> 4 "Lack of Adoption"               42
#> 5 "Lack of Value"                  28
#> 6 "Lost to Competition"            40

df_2 <- df_1 %>% pivot_wider(id_cols="LOST_REASON",
                         names_from = "Year1",
                         values_from = "TotalLost") %>% 
  left_join(Sums)
#> Joining, by = "LOST_REASON"

df_2
#> # A tibble: 6 x 7
#>   LOST_REASON                   `2016` `2017` `2018` `2019` `2020`   Sum
#>   <chr>                          <dbl>  <dbl>  <dbl>  <dbl>  <dbl> <dbl>
#> 1 ""                                 0      0     NA     NA     NA     0
#> 2 "Change in Business Strategy"     31     31     NA     NA     NA    62
#> 3 "Data Issue"                      12     NA     12     NA     NA    24
#> 4 "Lack of Adoption"                21     NA     NA     21     NA    42
#> 5 "Lack of Value"                   14     NA     NA     NA     14    28
#> 6 "Lost to Competition"             20     NA     NA     NA     20    40

Создано в 2020-04-23 с помощью пакета представительства (v0.3.0)

1 голос
/ 23 апреля 2020

Это будет опция pivot_wider после создания индекса строки на основе столбца 'Year'

library(dplyr)
library(tidyr)
library(data.table)
df_test1 %>%
   mutate(rn = rowid(Year1)) %>%
   pivot_wider(names_from = Year1, values_from = TotalLost) %>%
   mutate(Total = `2016` + `2017` + `2018`)
...