#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