R Создайте сводную таблицу, которая вычисляет проценты нескольких групп

Это мой пример набора данных

sample <- structure(list(Week  = c(1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2),
                         Project = c("A", "A", "A",  "A",  "B",  "B",  "B",  "B",  "C",  "C",  "C",  "A", "A",   "A" ), 
                    Status= c( "Active","Rescheduled","Active", "Cancelled", "Active", "Cancelled",  "Cancelled", 
                               "Rescheduled",  "Active",  "Active",   "Rescheduled", "Cancelled", "Cancelled", "Active")),
                    .Names = c("Week","Project","Status"),
                      class = "data.frame" , row.names = c(NA, -14L))
> sample
   Week Project      Status
1     1       A      Active
2     1       A Rescheduled
3     1       A      Active
4     1       A   Cancelled
5     1       B      Active
6     1       B   Cancelled
7     1       B   Cancelled
8     1       B Rescheduled
9     2       C      Active
10    2       C      Active
11    2       C Rescheduled
12    2       A   Cancelled
13    2       A   Cancelled
14    2       A      Active

и я хочу создать фрейм данных, который вычисляет активную скорость каждой программы и 1-активную ставку (= неактивную ставку) по неделям со значениями «NA».

Таким образом, таблица будет выглядеть так

  Week A_active_rate A_Non_active_rate B_active_rate B_Non_active_rate C_active_rate C_Non_active_rate
1    1          0.50              0.50          0.25              0.75            NA                NA
2    2          0.33              0.67            NA                NA          0.67              0.33
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вот один из подходов:

library(tidyverse)

sample <- structure(list(Week  = c(1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2),
                         Project = c("A", "A", "A",  "A",  "B",  "B",  "B",  "B",  "C",  "C",  "C",  "A", "A",   "A" ), 
                         Status= c( "Active","Rescheduled","Active", "Cancelled", "Active", "Cancelled",  "Cancelled", 
                                    "Rescheduled",  "Active",  "Active",   "Rescheduled", "Cancelled", "Cancelled", "Active")),
                    .Names = c("Week","Project","Status"),
                    class = "data.frame" , row.names = c(NA, -14L))

sample %>%
  mutate(active_or_not = ifelse(Status == "Active", "Active", "Non_Active")) %>%
  mutate(count = n(), .by = c(Week, Project, active_or_not)) %>%
  mutate(perc = count / n(), .by = c(Week, Project)) %>%
  pivot_wider(names_from = c(Project, active_or_not),
              id_cols = Week,
              values_from = perc,
              values_fn = mean,
              values_fill = NA,
              names_glue = "{.name}_rate")
#> # A tibble: 2 × 7
#>    Week A_Active_rate A_Non_Active_rate B_Active_rate B_Non_Active_rate
#>   <dbl>         <dbl>             <dbl>         <dbl>             <dbl>
#> 1     1         0.5               0.5            0.25              0.75
#> 2     2         0.333             0.667         NA                NA   
#> # ℹ 2 more variables: C_Active_rate <dbl>, C_Non_Active_rate <dbl>

Created on 2024-04-11 with reprex v2.1.0

Почему я получаю эту ошибку? Спасибо; > образец %>% + dplyr::summarise( + active_rate = mean(Status == "Active"), + Non_active_rate = 1 - active_rate, + .by = c(Week, Project) + ) %>% + tidyr:: Pivot_wider( + Names_from = Project, + Values_from = active_rate:Non_active_rate, + Names_glue = "{Project}_{.value}", + Names_vary = "slowest" + ) Ошибка в chr_as_locations(): ! Невозможно создать подгруппы несуществующих столбцов. ✖ Колонка Project не существует. Запустите rlang::last_trace(), чтобы увидеть, где произошла ошибка.

rocknRrr 11.04.2024 22:21
Ответ принят как подходящий

Еще один подход tidyverse:

library(dplyr)
library(tidyr)

sample %>%
  summarize(
    active_rate = mean(Status == "Active"),
    Non_active_rate = 1 - active_rate,
    .by = c(Week, Project)
  ) %>%
  pivot_wider(
    names_from = Project,
    values_from = active_rate:Non_active_rate,
    names_glue = "{Project}_{.value}",
    names_vary = "slowest"
  )
# # A tibble: 2 × 7
#    Week A_active_rate A_Non_active_rate B_active_rate B_Non_active_rate C_active_rate C_Non_active_rate
#   <dbl>         <dbl>             <dbl>         <dbl>             <dbl>         <dbl>             <dbl>
# 1     1         0.5               0.5            0.25              0.75        NA                NA    
# 2     2         0.333             0.667         NA                NA            0.667             0.333

Я запустил библиотеку rlang, но все равно получаю сообщение об ошибке: Ошибка в chr_as_locations(): ! Невозможно создать подгруппы несуществующих столбцов. ✖ Колонка Project не существует. Запустите rlang::last_trace(), чтобы увидеть, где произошла ошибка.

rocknRrr 11.04.2024 22:23

Какое отношение к чему-либо имеет rlang? Этот код отлично работает для меня с данными вашего примера. Не могли бы вы отредактировать свое сообщение, включив в него данные, которые вызывают ошибку? Поскольку ошибка говорит о том, что столбец Project не существует, подтвердили ли вы, что этот столбец существует в ваших данных?

zephryl 11.04.2024 22:26

Другие вопросы по теме