Как перевести данные в «длинном формате» в «широкий» формат, но сохранить некоторые категориальные столбцы одинаковыми

#r #dplyr

Вопрос:

У меня есть этот набор данных в «длинном формате», который я перечислил ниже.

введите описание изображения здесь

Моя цель — преобразовать эти данные в более короткий формат. У меня есть этот код, но я продолжаю получать NA в столбце Сумма.

 data %gt;%  group_by(Month, Year, Status) %gt;%   summarise(Sum = sum(Count))    

введите описание изображения здесь

данные

 data lt;- structure(list(Month = c("Oct", "Oct", "Oct", "Oct", "Oct", "Oct",  "Oct", "Oct", "Oct", "Oct", "Oct", "Oct", "Oct", "Oct", "Oct",  "Oct", "Oct", "Oct", "Oct", "Oct", "Oct", "Oct", "Oct", "Oct",  "Oct", "Oct", "Oct", "Oct", "Oct", "Oct", "Oct", "Oct", "Oct",  "Oct", "Oct", "Oct", "Sep", "Sep", "Sep", "Sep", "Sep", "Sep",  "Sep", "Sep", "Sep", "Sep", "Sep", "Sep", "Sep", "Sep", "Sep",  "Sep", "Sep", "Sep", "Sep", "Sep", "Sep", "Sep", "Sep", "Sep",  "Sep", "Sep", "Sep", "Sep", "Sep", "Sep", "Sep", "Sep", "Sep",  "Sep", "Sep", "Sep"), Year = c(2021L, 2021L, 2021L, 2021L, 2021L,  2021L, 2021L, 2021L, 2021L, 2021L, 2021L, 2021L, 2021L, 2021L,  2021L, 2021L, 2021L, 2021L, 2021L, 2021L, 2021L, 2021L, 2021L,  2021L, 2021L, 2021L, 2021L, 2021L, 2021L, 2021L, 2021L, 2021L,  2021L, 2021L, 2021L, 2021L, 2021L, 2021L, 2021L, 2021L, 2021L,  2021L, 2021L, 2021L, 2021L, 2021L, 2021L, 2021L, 2021L, 2021L,  2021L, 2021L, 2021L, 2021L, 2021L, 2021L, 2021L, 2021L, 2021L,  2021L, 2021L, 2021L, 2021L, 2021L, 2021L, 2021L, 2021L, 2021L,  2021L, 2021L, 2021L, 2021L), Status = c("Active", "Inactive",  "Active", "Inactive", "Active", "Inactive", "Active", "Inactive",  "Active", "Inactive", "Active", "Inactive", "Active", "Inactive",  "Active", "Inactive", "Active", "Inactive", "Active", "Inactive",  "Active", "Inactive", "Active", "Inactive", "Active", "Inactive",  "Active", "Inactive", "Active", "Inactive", "Active", "Inactive",  "Active", "Inactive", "Active", "Inactive", "Active", "Inactive",  "Active", "Inactive", "Active", "Inactive", "Active", "Inactive",  "Active", "Inactive", "Active", "Inactive", "Active", "Inactive",  "Active", "Inactive", "Active", "Inactive", "Active", "Inactive",  "Active", "Inactive", "Active", "Inactive", "Active", "Inactive",  "Active", "Inactive", "Active", "Inactive", "Active", "Inactive",  "Active", "Inactive", "Active", "Inactive"), Count = c(1L, 6L,  3L, 2L, NA, NA, 2L, 10L, 3L, 3L, 208L, 327L, 12L, 10L, 192L,  1L, NA, NA, 1L, 1L, 223L, 3L, 278L, 454L, 5L, 6L, 2L, 8L, 31L,  2L, 6L, 5L, 7L, 4L, 3L, 1L, 2L, 4L, 0L, 8L, 3L, 2L, 7L, 4L, 5L,  3L, 175L, 259L, 18L, 19L, NA, NA, 179L, 49L, 1L, 1L, 191L, 2L,  190L, 313L, 3L, 4L, 4L, 3L, NA, NA, 8L, 3L, 11L, 1L, NA, NA)), row.names = c(NA,  -72L), class = c("tbl_df", "tbl", "data.frame"))  

Ответ №1:

У вас в значительной степени правильный код. Вам просто нужно учитывать NAs с na.rm = TRUE помощью .

 library(dplyr)  data %gt;%  dplyr::group_by(Month, Year, Status) %gt;%  dplyr::summarise(Sum = sum(Count, na.rm = TRUE))  

Выход

 # A tibble: 4 × 5 # Groups: Month, Year [2]  Month Year Status Sum  lt;chrgt; lt;intgt; lt;chrgt; lt;intgt; 1 Oct 2021 Active 977 2 Oct 2021 Inactive 843 3 Sep 2021 Active 797 4 Sep 2021 Inactive 675  

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

 data %gt;%  dplyr::group_by(Month, Year, Status) %gt;%  dplyr::summarise(Sum = sum(Count, na.rm = TRUE)) %gt;%  # Need to ungroup the Status column.  dplyr::ungroup(Status) %gt;%  dplyr::mutate(percent = (Sum / sum(Sum)) * 100)  

Выход

 # A tibble: 4 × 5 # Groups: Month, Year [2]  Month Year Status Sum percent  lt;chrgt; lt;intgt; lt;chrgt; lt;intgt; lt;dblgt; 1 Oct 2021 Active 977 53.7 2 Oct 2021 Inactive 843 46.3 3 Sep 2021 Active 797 54.1 4 Sep 2021 Inactive 675 45.9  

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

1. Спасибо за ответ, есть ли простой способ создать новую колонку, которая будет показывать мне процент от каждого месяца, года, статуса? Например, в октябре 2021 года активных будет 54%, а неактивных-46%.

2. @RL_Pug Я обновил свой ответ, включив столбец в процентах.

Ответ №2:

Я думаю, вам просто нужна была часть na.rm = TRUE в сумме

 out lt;- data %gt;%  dplyr::group_by(Month, Year, Status) %gt;%  dplyr::summarise(Sum = sum(Count, na.rm = TRUE))  out # A tibble: 4 x 4 # Groups: Month, Year [2]  Month Year Status Sum  lt;chrgt; lt;intgt; lt;chrgt; lt;intgt; 1 Oct 2021 Active 977 2 Oct 2021 Inactive 843 3 Sep 2021 Active 797 4 Sep 2021 Inactive 675